Загрузка Amazon S3 с общедоступными разрешениями
Я использую SDK Amazon С# и пытаюсь загрузить файл, но по умолчанию он имеет ограниченные разрешения. Я хотел бы сделать его общедоступным, но я не могу понять, как это сделать как часть загрузки.
Мой ведро является общедоступным, но когда я загружаю новый файл, используя приведенный ниже код, загружаемый файл не является общедоступным.
Кто-нибудь должен был сделать это раньше?
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 = result;
}
}
Ответы
Ответ 1
Обнаружено, что нужно использовать 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 = result;
}
}
Ответ 2
Решение 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);
}
Ответ 3
Я сделал это раньше и на С#, но не с вашей библиотекой (так что это может быть ограниченной помощью).
Идея состоит в том, чтобы отправить заголовок 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);
}
Ответ 4
Рассмотрим подход CannedACL, показанный в следующем фрагменте:
string filePath = @"Path\Desert.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);