Загрузка файла AWS S3 .NET SDK (.NET Core) Не удается записать данные в транспортное соединение

#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. Это не существующий ранее элемент