【问题标题】:AWS S3 File Upload .NET SDK (.NET Core) Unable to write data to the transport connectionAWS S3 文件上传 .NET SDK (.NET Core) 无法将数据写入传输连接
【发布时间】:2019-08-19 04:42:36
【问题描述】:

我正在编写一个将多个文件上传到 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
        };
    }

【问题讨论】:

  • 看来你得设置ACL权限了。
  • 不,事实并非如此。在我使用没有 TransferUtilityUploadRequest 的未注释代码的情况下,上传到存储桶成功。删除 CannedACL 设置也没有任何区别。
  • 好的。我的第二个条件是:我知道要使用发送请求,您需要使用内置的 aws 请求方法,例如 FileTransferUtilityRequest。

标签: c# asp.net-core amazon-s3 aws-sdk


【解决方案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);

【讨论】:

  • 这不是预先存在的项目
猜你喜欢
  • 2018-04-05
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多