分段上传到 S3 分为 3 个步骤:
- 启动分段上传
- 上传部分
- 完成分段上传
使用AWS SDK for JavaScript v3(正好v3.22),前两步成功:
-
UploadId
来自初始化。 - 每个上传的部分都带有完成该部分所需的
etag
上传。
请求完成上传的问题是通过以下方式完成的:
const completeParams: CompleteMultipartUploadCommandInput = {
Bucket,Key,UploadId,MultipartUpload: { Parts },};
return client.send(new CompleteMultipartUploadCommand(completeParams));
其中 Parts
是按 CompletedPart
排序的有效 PartNumber
对象数组。
分析网络调用,请求完成
https://{Bucket}.s3.{Location}.scw.cloud/{Key}?uploadId={UploadId}&x-id=CompleteMultipartUpload
注意:用占位符替换了合理数据,但它们是预期值。
AWS SDK 生成的正文是:
<?xml version="1.0" encoding="UTF-8"?>
<CompletedMultipartUpload xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Part>
<etag>"610c4..."</etag>
<PartNumber>1</PartNumber>
</Part>
<Part>
<etag>"2edb4..."</etag>
<PartNumber>2</PartNumber>
</Part>
</CompletedMultipartUpload>
注意:只显示每个 etag 的前 5 个字符,以表明它们是不同的并且来自上传部分。
但来自 S3 的答案是:
The XML you provided was not well-formed or did not validate against our published schema.
阅读extensive documentation,有一个微妙的区别:XML 的根元素应该是 CompleteMultipartUpload
而不是 CompletedMultipartUpload
,但是 XML 是由 AWS SDK 生成的,我会希望它是正确的。
可能有什么问题?