.NET 6中TransferUtility上传S3报错:aws-chunked不支持
AWS S3高级API上传报错:aws-chunked编码不支持的解决方法
问题描述
使用AWS S3 .NET SDK(版本3.7.101.59,目标框架net6.0)的高级API进行文件上传时,抛出异常:
Amazon.S3.AmazonS3Exception: Transfering payloads in multiple chunks using aws-chunked is not supported.
客户端配置代码如下(仅手动修改了客户端创建部分,其余与官方示例一致):
var configuration = new AmazonS3Config { ForcePathStyle = true, ServiceURL = "URL", }; var credentials = new BasicAWSCredentials("ACCESS_KEY", "SECRET"); IAmazonS3 client = new AmazonS3Client(credentials, configuration);
但使用PutObjectRequest并设置UseChunkEncoding = false时,上传可以正常运行:
fs.Seek(0, SeekOrigin.Begin); var uploadRequest = new PutObjectRequest { InputStream = fs, Key = outputFileName, BucketName = bucketName, UseChunkEncoding = false, }; await _client.PutObjectAsync(uploadRequest);
原因分析
AWS S3的高级多部分上传API(比如TransferUtility)默认会启用aws-chunked分块编码,这是AWS特有的分块传输方式。如果对接的是兼容S3的第三方存储服务(如MinIO、阿里云OSS等),这类服务可能不支持该编码格式,从而触发报错。而PutObjectRequest是单部分上传接口,手动关闭UseChunkEncoding后使用了标准HTTP分块,因此能正常工作。
解决方案
方案1:全局禁用aws-chunked编码
在创建AmazonS3Config时直接添加UseChunkEncoding = false,全局生效:
var configuration = new AmazonS3Config { ForcePathStyle = true, ServiceURL = "URL", UseChunkEncoding = false, // 全局禁用aws-chunked编码 }; var credentials = new BasicAWSCredentials("ACCESS_KEY", "SECRET"); IAmazonS3 client = new AmazonS3Client(credentials, configuration);
方案2:针对TransferUtility单独配置
如果不想全局修改,可在初始化TransferUtility时通过TransferUtilityConfig关闭分块编码:
var transferConfig = new TransferUtilityConfig { UseChunkEncoding = false }; var transferUtility = new TransferUtility(client, transferConfig); // 后续使用transferUtility执行上传操作
验证
修改配置后,使用高级API上传文件即可避免aws-chunked相关异常,与单部分上传表现一致。
内容的提问来源于stack exchange,提问作者Jaroslav
相关产品推荐
相关产品推荐

