2016-02-25 2 views
1

Нам нужно работать с веб-приложением на основе .net, которое будет загружать файлы в хранилище Amazon S3, используя панель администратора приложения, и клиенты будут передаваться загружаемым файлам с помощью client.aspx файл.Как обслуживать не общедоступный файл непосредственно из хранилища Amazon s3

Мы рассмотрели несколько примеров и смутили некоторые примеры кода для загрузки не общедоступных файлов из хранилища S3. один из таких примеров ниже

AmazonS3Config config = new AmazonS3Config() 
{ 
RegionEndpoint = RegionEndpoint.USEast1 
}; 
IAmazonS3 client = new AmazonS3Client(accessKey, secretKey, config); 
string dest = System.IO.Path.GetTempPath() + "event.mp4"; 
using (client) 
{ 
GetObjectRequest request = new GetObjectRequest() { BucketName = "bucketname" + @"/" + "videos2015", Key = "event.mp4" }; 
using (GetObjectResponse response = client.GetObject(request)) 
{ 
response.WriteResponseStreamToFile(dest); 
} 
} 
Response.Clear(); 
Response.AppendHeader("content-disposition", "attachment; filename=" + "dynamic_filename.png"); 
Response.ContentType = "application/octet-stream"; 
Response.TransmitFile(dest); 
Response.Flush(); 
Response.End(); 

Когда пользователь нажимает на ссылку следующий код запускается на выполнение на веб-сервере и код загрузки файла на веб-сервере, а затем служит тот же файл для клиента ... если я не ошибаюсь. Не существует способа, которым мы можем обслуживать файл для загрузки непосредственно из хранилища AWS S3.

В приведенном выше случае это трата ресурсов сервера и увеличивает время загрузки.

Out файлы на AWS не Public они не являются общественности, так что URL не доступен напрямую из клиентских браузеров, как в случае типа общественного содержания

+0

Я думаю, что решение моей проблемы Amazon S3 Pre-Signed URL – Learning

+0

но вы можете дать общественности скачать только разрешение на ваше ведро? –

+0

Я не могу сделать файлы общедоступными ... – Learning

ответ

2

Предварительно подписанные URL'ы, являются на самом деле то, что вы ищете. Так как вы используете C#, вот ссылка на некоторые полезные примеры кода:

http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLDotNetSDK.html

Там нет необходимости загружать файлы на s3 через ваш веб-сервер, они могут быть направлены непосредственно. То же самое при загрузке, загрузка непосредственно с S3 - сначала не копируйте их в EC2, вы будете тратить ресурсы на пропускную способность и ресурсы обработки.

1

Вы можете использовать Minio-dotnet client library Его Открытый исходный код & поддерживает совместимый S3 API.

Вот пример для PresignedPostPolicy

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using Minio; 

namespace Minio.Examples 
{ 
    class PresignedPostPolicy 
    { 
     static int Main() 
     { 
      /// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and 
      /// my-objectname are dummy values, please replace them with original values. 
      var client = new MinioClient("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY"); 
      PostPolicy form = new PostPolicy(); 
      DateTime expiration = DateTime.UtcNow; 
      form.SetExpires(expiration.AddDays(10)); 
      form.SetKey("my-objectname"); 
      form.SetBucket("my-bucketname"); 

      Dictionary <string, string> formData = client.PresignedPostPolicy(form); 
      string curlCommand = "curl "; 
      foreach (KeyValuePair<string, string> pair in formData) 
      { 
        curlCommand = curlCommand + " -F " + pair.Key + "=" + pair.Value; 
      } 
      curlCommand = curlCommand + " -F [email protected]/etc/bashrc https://s3.amazonaws.com/my-bucketname"; 
      Console.Out.WriteLine(curlCommand); 
      return 0; 
     } 
    } 
} 

И ниже одной для PresignedPutObject

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using Minio; 

namespace Minio.Examples 
{ 
    class PresignedPutObject 
    { 
     static int Main() 
     { 
      /// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and 
      /// my-objectname are dummy values, please replace them with original values. 
      var client = new MinioClient("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY"); 
      Console.Out.WriteLine(client.PresignedPutObject("my-bucketname", "my-objectname", 1000)); 
      return 0; 
     } 
    } 
} 

Надеется, что это помогает.

PS: Я работаю Minio

Смежные вопросы