【问题标题】:Problem in uploading multipart Amazon S3 Rest API using PostMan使用 PostMan 上传多部分 Amazon S3 Rest API 时出现问题
【发布时间】:2020-08-24 04:31:20
【问题描述】:

我正在尝试使用Amazon-S3 REST API 分块上传大文件。

根据此处的 API 文档,我向邮递员提出了如下请求。

在发起 CreateMultipartUpload 发布请求后,我成功获取了用于块放置请求的 UploadId。 这工作正常。

我了解 Multipart order,但是在使用 POSTMAN 执行上传 partNumber & UploadId 块的步骤时,我收到 SHA256Mismatch 错误,因为 POSTMAN 为整个文件而不是块计算 Content-MD5

  1. 标题

  2. 参数

  3. 正文

我在各种论坛上找到了多种解决方案,但这些解决方案都不起作用。 我在这里遗漏了什么吗?

【问题讨论】:

    标签: amazon-web-services rest amazon-s3 postman multipart


    【解决方案1】:

    使用 PostMan 使用 Amazon 的分段上传成功上传到 Amazon S3,关键(对我而言)是手动添加 Content-MD5 标头,并粘贴该部分的 Base64 编码 MD5 哈希(详情如下)。这可能不是 OP 遇到的确切问题,但我仍然想分享如何使用 PostMan,前提是您的 Amazon S3 存储桶具有良好的工作 IAM 密钥 ID 和密钥。

    首先,我将一个 9 MB 的“mytest.pdf”文件分成两部分进行测试(我使用 Linux/WSL 命令:split -b 5242880 mytest.pdf)确保第一部分大于 5MB(最后一部分可以更小大于 5 MB)。

    接下来,使用以下四个请求设置 PostMan:

    1. CreateMultipartUpload(例如,POST https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?uploads
    2. 上传第 1 部分(例如,PUT HTTPS:// {{mybucket}} .S3 {{myregion}} .amazonaws.com / mytest.pdf部分号码= 1&UPLOADID = 297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO) LI>
    3. 上传第 2 部分(例如,PUT HTTPS:// {{mybucket}} .S3 {{myregion}} .amazonaws.com / mytest.pdf部分号码= 2&UPLOADID = 297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO) LI>
    4. CompleteMultipartUpload(例如,POST https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?uploadId=297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsWMWDV6KKDVr>kdlQsGJDOV6

    我在 PostMan 的授权部分粘贴了我的 IAM 密钥 ID 和访问密钥(单独的文章)

    运行 CreateMultipartUpload POST 以从 Amazon 获取 UploadId。

    接下来,计算我的两个文件部分的每个部分的 MD5 哈希(我使用 7-zip,但使用您选择的工具)。现在,将该结果转换为 Base64。但是,我必须确保最终得到 22 个字符,后跟两个等号 == 可选。当我将 MD5 作为文本转换为 Base64 时,我得到了一个更长的字符串,它以单个等号结尾,而不是双等号(这表明它没有以亚马逊期望的方式编码,并且会产生 InvalidDigest 错误)。例如,如果您使用 7-zip 计算文件部分的 MD5 哈希并得到值 58942651efd0f5886810d04ed9df502f,然后使用下面的 Bases64 编码器等工具并在 Text 处选择输入,您将得到 NTg5NDI2NTFlZmQwZjU4ODY4MTBkMDRlZDlkZjUwMmY= 但如果您选择“HEX”作为输入时,您会得到一个较小的字符串 WJQmUe/Q9YhoENBO2d9QLw==,即 24 个字符(22 个字符 + 2 个等号)。这就是你想要的。

    (没有暗示对此工具的认可 - 不隶属于https://emn178.github.io/online-tools/base64_encode.html

    如果你弄错了,亚马逊会回复下面的InvalidDigest错误

    <?xml version="1.0" encoding="UTF-8"?>
    <Error>
        <Code>InvalidDigest</Code>
        <Message>The Content-MD5 you specified was invalid.</Message>
        <Content-MD5>thisisbad</Content-MD5>
        <RequestId>8274DC9566D4AAA8</RequestId>
        <HostId>H6kSy4cl+54nMon1Hq6AGjmTX/MfTVMQQr8vEVNXUnPlfMtIt8HPdObfusckhBpwpG/CJ6ORWv16c=</HostId>
    </Error>
    

    同时运行 UploadPart1 和 2

    最后使用从前 2 个请求的标头中复制和粘贴的 Etag 值运行 CompleteMultipartUpload

    <CompleteMultipartUpload>
        <Part>
        <PartNumber>1</PartNumber>
        <ETag>"c716d98e83db1edb27fc25fd03e0ae32"</ETag>
        </Part>
        <Part>
        <PartNumber>2</PartNumber>
        <ETag>"58942651efd0f5886810d04ed9df502f"</ETag>
        </Part>
    </CompleteMultipartUpload>
    

    【讨论】:

      猜你喜欢
      • 2019-02-13
      • 2011-12-31
      • 2011-06-09
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多