#c# #asp.net-core #amazon-s3 #aws-sdk
#c# #asp.net-core #amazon-s3 #aws-sdk
Вопрос:
Я пишу функцию для загрузки нескольких файлов в AWS S3. Даже с одним файлом приведенный ниже код с использованием TransferUtilityUploadRequest завершается ошибкой:
System.IO.IOException: Не удается записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом.
Код без комментариев работает (но я не могу установить разрешения ACL). Просмотрев несколько примеров в Интернете, я не уверен, что я делаю неправильно? Проблема не в ограничениях RequestFormLimits, код завершается ошибкой в момент, когда он пытается загрузить на S3.
[HttpPost("test/raw-file-upload-s3")]
[RequestFormLimits(MultipartBodyLengthLimit = 1073741824)]
[RequestSizeLimit(1073741824)]
public async Task<ActionResult<object>> UploadFiles3(IList<IFormFile> files)
{
var regionEndpoint = RegionEndpoint.GetBySystemName(_awsS3RegionEndpoint);
var uploadedFileNames = new List<string>();
using (var awsS3Client = new AmazonS3Client(new BasicAWSCredentials(_awsAccessKeyId, _awsSecretKey), regionEndpoint))
{
using (var fileTransferUtility = new TransferUtility(awsS3Client))
{
var dateBasedDirectoryName = GetDateBasedDirectoryName();
string contentDirectory = $@"example/";
var tasks = new Task[files.Count];
var streams = new Stream[files.Count];
for (int i = 0; i < files.Count; i )
{
string fileName = $"{Guid.NewGuid()}_{files[i].FileName}";
string key = $"{contentDirectory}{fileName}";
streams[i] = files[i].OpenReadStream();
tasks[i] = fileTransferUtility.UploadAsync(streams[i], _awsS3AssetsBucket, key);
// var fileTransferUtilityRequest = new TransferUtilityUploadRequest
// {
// BucketName = _awsS3AssetsBucket,
// Key = key,
// CannedACL = S3CannedACL.PublicRead,
// InputStream = streams[i]
// };
// tasks[i] = fileTransferUtility.UploadAsync(fileTransferUtilityRequest);
}
await Task.WhenAll(tasks).ConfigureAwait(false);
for (int i = 0; i < files.Count; i )
{
streams[i].Close();
}
}
}
return new
{
uploadedFiles = uploadedFileNames
};
}
Комментарии:
1. Похоже, вам нужно установить разрешения ACL.
2. Нет, это не тот случай. Загрузка в корзину завершается успешно, когда я использую раскомментированный код без TransferUtilityUploadRequest. Удаление параметра CannedACL также не имеет значения.
3. Хорошо. Мое второе условие таково: я знаю, что для использования запроса отправки вам нужно использовать встроенный метод запроса aws, такой как FileTransferUtilityRequest.
Ответ №1:
Можете ли вы попробовать ниже
// Set Canned ACL (PublicRead) for an existing item
client.PutACL(new PutACLRequest
{
BucketName = _awsS3AssetsBucket,
Key = key,
CannedACL = S3CannedACL.PublicRead
});
Перед этой строкой
tasks[i] = fileTransferUtility.UploadAsync(streams[i], _awsS3AssetsBucket, key);
Комментарии:
1. Это не существующий ранее элемент