使用 PostMan 上传分段 Amazon S3 Rest API 时出现问题

Problem in uploading multipart Amazon S3 Rest API using PostMan

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

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

启动 CreateMultipartUpload Post 请求后,我成功获取了块放置请求的 UploadId。 这工作正常。

我理解多部分顺序,但是当使用 POSTMAN 执行上传 partNumber & UploadId 块的步骤时,我得到 SHA256Mismatch 错误,因为 POSTMAN 为整个文件而不是块计算 Content-MD5

  1. Header

  2. 参数

  3. Body

我在各种论坛上找到了多种解决方案,但这些解决方案均无效。 我在这里遗漏了什么吗?

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

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

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

  1. CreateMultipartUpload(例如,POST https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?uploads
  2. UploadPart1(例如,PUT https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?partNumber=1&uploadId=297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO)
  3. UploadPart2(例如,PUT https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?partNumber=2&uploadId=297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO)
  4. 完成多部分上传(例如,POST https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?uploadId=297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO)

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

运行 CreateMultipartUpload POST 从亚马逊获取 UploadId。

接下来,计算我的两个文件部分的每个部分的 MD5 哈希值(我使用 7-zip,但使用您选择的工具)。现在,将该结果转换为 Base64。但是,我必须确保我以 22 个字符结束,后跟可选的两个等号 == 。当我将 MD5 作为文本转换为 Base64 时,我得到了一个更长的字符串,它以一个等号结尾,而不是双等号(这表明它没有以亚马逊期望的方式编码,并将产生 InvalidDigest 错误).例如,如果您使用 7-zip 计算文件部分的 MD5 哈希并获得值 58942651efd0f5886810d04ed9df502f,然后使用下面的 Bases64 编码器之类的工具并在文本中选择输入,您将获得 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

最后 运行 CompleteMultipartUpload 复制并粘贴前 2 个请求Headers 中的 Etag 值

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