【问题标题】:XML error completing a multi-part upload to S3 with AWS SDK for JavaScript v3使用适用于 JavaScript v3 的 AWS 开发工具包完成向 S3 的多部分上传时出现 XML 错误
【发布时间】:2021-10-04 02:28:17
【问题描述】:

多部分上传到 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 是按PartNumber 排序的有效CompletedPart 对象数组。

分析网络调用,请求完成

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.

调用顺序:

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

可能出了什么问题?

【问题讨论】:

    标签: javascript amazon-web-services amazon-s3 aws-sdk aws-sdk-js


    【解决方案1】:

    问题

    这是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',
        }
      );
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多