.NET版S3Client未找到UploadPartCopy API如何实现S3分片拷贝
.NET版S3 SDK中UploadPartCopy能力的实现方式
你没有找到单独命名为UploadPartCopy的API不是查阅遗漏,该能力在.NET SDK中没有做独立的方法封装,而是复用了UploadPart/UploadPartAsync方法,通过请求参数区分是本地上传分片还是服务端拷贝分片。
具体使用规则如下:
- 构造
UploadPartRequest对象时,无需为InputStream属性传入本地文件/内存流,只要配置拷贝源相关参数,SDK就会自动调用S3的UploadPartCopy接口完成服务端侧分片拷贝,不会产生数据下载到本地再回传的传输开销。 - 拷贝场景下
UploadPartRequest的核心必填参数:BucketName:分片上传的目标存储桶名Key:分片上传的目标对象键UploadId:之前初始化分片上传任务返回的上传任务IDPartNumber:当前分片的序号,从1开始计数CopySource:源对象路径,格式为/源存储桶名/源对象键CopySourceRange:当前分片对应源对象的字节范围,格式为bytes=起始字节偏移-结束字节偏移
- 所有分片拷贝完成后,和普通分片上传流程一致,收集每个分片返回的
PartNumber和ETag,调用CompleteMultipartUpload/CompleteMultipartUploadAsync即可完成多对象合并为单个目标对象的操作。
最简代码示例:
// 初始化分片上传 var initRequest = new InitiateMultipartUploadRequest { BucketName = "target-bucket", Key = "merged-final-object" }; var initResponse = await s3Client.InitiateMultipartUploadAsync(initRequest); // 服务端拷贝第一个分片:取source-bucket下object-a的0-5MB内容 var firstPartRequest = new UploadPartRequest { BucketName = "target-bucket", Key = "merged-final-object", UploadId = initResponse.UploadId, PartNumber = 1, CopySource = "/source-bucket/object-a", CopySourceRange = "bytes=0-5242879" }; var firstPartResponse = await s3Client.UploadPartAsync(firstPartRequest); // 按相同逻辑拷贝其余源对象的内容作为后续分片,收集所有分片的ETag和PartNumber // ... // 完成分片上传合并 var completeRequest = new CompleteMultipartUploadRequest { BucketName = "target-bucket", Key = "merged-final-object", UploadId = initResponse.UploadId, PartETags = collectedPartETags // 收集到的所有分片信息列表 }; await s3Client.CompleteMultipartUploadAsync(completeRequest);
注意:使用该方式时,要保证所用的S3认证身份同时拥有源对象的读权限、目标存储桶的分片上传写权限,否则会抛出权限拒绝异常。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

