3

我有一个 node.js 应用程序,它会定期将一些数据推送到 Amazon S3。我正在使用 Put 请求将缓冲区推送到 S3。

我知道 S3 请求的“content-md5”参数需要是我正在推送的内容的 base64 编码 Md5 哈希。 让我感到困惑的是,90% 的情况下,我的请求都会成功。 另外 10% 的时间,我的散列方法根本没有改变,亚马逊给了我“badDigest”错误:

{ [Error: API error with HTTP Code: 400]
  headers: 
   { 
     'content-type': 'application/xml',
     'transfer-encoding': 'chunked',
     date: 'Fri, 06 Apr 2012 02:20:14 GMT',
     connection: 'close',
     server: 'AmazonS3' },
  code: 400,
  document: 
   { Code: 'BadDigest',
     Message: 'The Content-MD5 you specified did not match what we received.',
     ExpectedDigest: 'fPRrmxapcSHmI2gljme1Fg==',
     CalculatedDigest: 'w6PoDxh2ty478+Mw2UwTrA==',
     RequestId: '1018E7A80A8B0B00',
     HostId: 'W/SK/OovQHlsi593DJ154pkHdOrUk3oMWmIGNdOKj3WaHa8cBknhB+7H5IdZLUjt' } }

以前有没有其他人经历过 S3 的这种随机性?我错过了一些明显的东西吗?

谢谢!

4

2 回答 2

2

您可能忘记指定'utf8'update.

var status = 'काक्नोम्यत्क्नोम्यत्चं शक्नोम्यत्तुमतुम् ।तुम् ।् । नोपहिनस्ति माम् ॥';
var contentMd5 = crypto
                  .createHash('md5')
                  .update(status, 'utf8')
                  .digest('base64');

没有它在大多数情况下都有效,但当您的字符串包含多字节字符时则无效。

于 2012-04-27T13:49:07.047 回答
1

aws-sdk 将自动为您计算 ContentMD5 和 ContentLength 值。如果您有一个 UTF-8 字符串并且您正在使用 '।्'.length 设置 ContentLength 值 S3 将返回 BadDigest 错误。所以我的解决方案就是让 aws-sdk 计算 ContentMD5 和 ContentLength 值。

于 2016-01-26T22:32:43.517 回答