#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
};