使用 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:
- CreateMultipartUpload(例如,POST
https://{{mybucket}}.s3.{{myregion}}.amazonaws.com/mytest.pdf?uploads
- 上传第 1 部分(例如,PUT
HTTPS:// {{mybucket}} .S3 {{myregion}} .amazonaws.com / mytest.pdf部分号码= 1&UPLOADID = 297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO) LI>
- 上传第 2 部分(例如,PUT
HTTPS:// {{mybucket}} .S3 {{myregion}} .amazonaws.com / mytest.pdf部分号码= 2&UPLOADID = 297a2XMl9kNDqw1BaKl7jk6uK_Mop0mCV68TmWU2n8xjsrM6sgt0hu.93J92Qgw8yaEHlrlj0MSoc9ljmU3sD3dlQsGJixMq9hugPDRTkikM0KV6rmLdpmHjFcWzDEDO) LI>
- 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>