使用适用于 JavaScript 的 AWS 开发工具包 v3 完成多部分上传到 S3 的 XML 错误

分段上传到 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>&quot;610c4...&quot;</etag>
    <PartNumber>1</PartNumber>
  </Part>
  <Part>
    <etag>&quot;2edb4...&quot;</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.

调用顺序:

使用适用于 JavaScript 的 AWS 开发工具包 v3 完成多部分上传到 S3 的 XML 错误

阅读extensive documentation,有一个微妙的区别:XML 的根元素应该是 CompleteMultipartUpload 而不是 CompletedMultipartUpload,但是 XML 是由 AWS SDK 生成的,我会希望它是正确的。

可能有什么问题?

Venus0808 回答:使用适用于 JavaScript 的 AWS 开发工具包 v3 完成多部分上传到 S3 的 XML 错误

问题

这是一个open issue at aws-sdk-js-v3 official repository.

该错误确实是 XML 元素上的拼写错误。它必须是 CompleteMultipartUpload 而不是 CompletedMultipartUpload(额外的 d)。

解决方法

使用中间件替换无效的 XML 标记,如下所示:

const patchS3CompleteMultipartUpload = (client: S3Client): void => {
  client.middlewareStack.add(
    (next,_context) => (args: any) => {
      if ('string' === typeof args.request?.body && args.request.body.includes('CompletedMultipartUpload')) {
        args.request.body = args.request.body.replace(/CompletedMultipartUpload/g,'CompleteMultipartUpload');
      }
      return next(args);
    },{
      step: 'build',priority: 'high',}
  );
};
本文链接:https://www.f2er.com/23493.html

大家都在问