Загрузка Amazon S3 с общедоступными разрешениями

#c# #amazon-s3

#c# #amazon-s3

Вопрос:

Я использую Amazon C # SDK и пытаюсь загрузить файл, но по умолчанию он имеет ограниченные разрешения. Я хотел бы сделать его общедоступным, но, похоже, я не могу понять, как это сделать как часть загрузки.

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

Кто-нибудь должен был делать это раньше?

 public class S3Uploader
{
    private string awsAccessKeyId;
    private string awsSecretAccessKey;
    private string bucketName;
    private Amazon.S3.Transfer.TransferUtility transferUtility;

    public S3Uploader(string bucketName)
    {
        this.bucketName = bucketName;
        this.transferUtility = new Amazon.S3.Transfer.TransferUtility("XXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

    }

    public void UploadFile(string filePath, string toPath)
    {
        AsyncCallback callback = new AsyncCallback(uploadComplete);
        transferUtility.BeginUpload(filePath, bucketName, toPath, callback, null);
    }

    private void uploadComplete(IAsyncResult result)
    { 
        var x = resu<
    }
}
  

Ответ №1:

Решение Tahbaza правильное, но оно не работает в более поздних версиях AWS SDK (2.1 )…

Рассмотрите возможность использования следующего для версий SDK 2.1 :

 private void UploadFileToS3(string filePath)
{
    var awsAccessKey = ConfigurationManager.AppSettings["AWSAccessKey"];
    var awsSecretKey = ConfigurationManager.AppSettings["AWSSecretKey"];
    var existingBucketName = ConfigurationManager.AppSettings["AWSBucketName"];
    var client = Amazon.AWSClientFactory.CreateAmazonS3Client(awsAccessKey, awsSecretKey,RegionEndpoint.USEast1);

    var uploadRequest = new TransferUtilityUploadRequest
    {
        FilePath = filePath,
        BucketName = existingBucketName,
        CannedACL = S3CannedACL.PublicRead
    };

var fileTransferUtility = new TransferUtility(client);
    fileTransferUtility.Upload(uploadRequest);
} 
  

Комментарии:

1. Возможно, немного поздно для OP, но, пожалуйста, также обратите внимание, что SDK поставляется с рядом методов асинхронной загрузки и выгрузки, которые используют библиотеку параллельных задач. Использование: ожидание возможности передачи файлов. UploadAsync (uploadRequest); Пример кода из Amazon здесь: blogs.aws.amazon.com/net/post/TxPJDGHVNCWHUJ /…

2. Привет, Дэниел, если я изучу и использую приведенный выше код, будет ли загруженный файл закрытым. Если я вставлю URL-адрес объекта, будет ли указано, что доступ запрещен?

Ответ №2:

Нашел его, нужно использовать TransferUtilityUploadRequest :

 public class S3Uploader
{
    private string awsAccessKeyId;
    private string awsSecretAccessKey;
    private string bucketName;
    private Amazon.S3.Transfer.TransferUtility transferUtility;

    public S3Uploader(string bucketName)
    {
        this.bucketName = bucketName;
        this.transferUtility = new Amazon.S3.Transfer.TransferUtility("XXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

    }

    public void UploadFile(string filePath, string toPath)
    {
        AsyncCallback callback = new AsyncCallback(uploadComplete);
        var uploadRequest = new TransferUtilityUploadRequest();
        uploadRequest.FilePath = filePath;
        uploadRequest.BucketName = "my_s3_bucket";
        uploadRequest.Key = toPath;
        uploadRequest.AddHeader("x-amz-acl", "public-read");
        transferUtility.BeginUpload(uploadRequest, callback, null);
    }

    private void uploadComplete(IAsyncResult result)
    { 
        var x = resu<
    }
}
  

Комментарии:

1. К вашему сведению, вам нужно указать uploadRequest.BucketName , чтобы загрузка работала.

2. Этот метод установки заголовков устарел после версии 1 S3. У TransferUtilityUploadRequest объекта больше нет AddHeader метода. Правильный ответ теперь принадлежит danielonthenet.

Ответ №3:

Я делал это раньше и на C #, но не с вашей библиотекой (так что это может оказать ограниченную помощь).

Идея состоит в том, чтобы отправить заголовок ACL вместе с файлом.

Это один из способов сделать это, который должен указать вам правильное направление.

Вот также ссылка на некоторые соответствующие документы AWS.

     private const string AWS_ACL_HEADER = "x-amz-acl";

    private static string ToACLString(S3ACLType acl) {
        switch (acl) {
            case S3ACLType.AuthenticatedRead:
                return "authenticated-read";
            case S3ACLType.BucketOwnerFullControl:
                return "bucket-owner-full-control";
            case S3ACLType.BucketOwnerRead:
                return "bucket-owner-read";
            case S3ACLType.Private:
                return "private";
            case S3ACLType.PublicRead:
                return "public-read";
            case S3ACLType.PublicReadWrite:
                return "public-read-write";
            default: return "";
        }
    }

    public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
        string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
        DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
        msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
        msg.Headers[DreamHeaders.EXPECT] = "100-continue";
        msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
        Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
        s3Client.At(id).Put(msg);
    }
  

Комментарии:

1. спасибо за помощь с заголовками. Я опубликовал свой собственный ответ только потому, что он использует стандартную библиотеку aws, которая использует преимущества многочастной загрузки s3, что позволяет загружать фрагменты файла асинхронно, что делает его намного быстрее

Ответ №4:

Рассмотрим подход CannedACL, показанный в следующем фрагменте:

         string filePath = @"PathDesert.jpg";
        Stream input = new FileStream(filePath, FileMode.Open);
        PutObjectRequest request2 = new PutObjectRequest();
        request2.WithMetaData("title", "the title")
            .WithBucketName(bucketName)
            .WithCannedACL(S3CannedACL.PublicRead)
            .WithKey(keyName)
            .WithInputStream(input);
  

Комментарии:

1. AWS SDK помечает этот подход как устаревший и будет удален в версии 2.0

Ответ №5:

Вы можете использовать свойство CannedACL из Amazon.S3.Model.PutObjectRequest для загрузки файлов в S3, как показано ниже,

  var putObjectRequest = new Amazon.S3.Model.PutObjectRequest
                        {
                            BucketName = bucketName,
                            Key = key,
                            CannedACL = S3CannedACL.PublicReadWrite
                        };