【问题标题】:The Content-MD5 you specified is invalid for multi-part uploads您指定的 Content-MD5 对分段上传无效
【发布时间】:2020-06-26 13:11:01
【问题描述】:

我正在为 nodejs 使用 awd-sdk 并且上传正常。

const checksum = await this.getChecksum(path);
const payload: S3.PutObjectRequest = {
  Bucket: bucket,
  Key: key,
  Body: fs.createReadStream(path),
  ContentMD5: checksum,
};
return this.s3.upload(payload).promise();

这段代码非常适用于小文件,并利用了自动验证文件完整性的 ContentMD5

内容-MD5 根据 RFC 1864 对消息(不包括标头)进行 base64 编码的 128 位 MD5 摘要。此标头可用作消息完整性检查,以验证数据是否与最初发送的数据相同。尽管它是可选的,但我们建议使用 Content-MD5 机制作为端到端的完整性检查。有关 REST 请求身份验证的更多信息,请参阅 REST 身份验证。 https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html

但是它不适用于分段上传。

The Content-MD5 you specified is invalid for multi-part uploads.

这是有道理的,因为我们逐块发送文件,但是我想知道我应该如何在分段上传中使用此功能?

【问题讨论】:

  • Content-MD5 对分段上传有效,但您显示的代码不执行分段上传,因此我们需要查看实际引发此错误的代码。
  • 是的,当文件大小超过multipart_threshold 时,upload 方法会自动进行分段上传。见here。 “新的 AWS.S3.upload() 函数智能地检测缓冲区或流何时可以拆分为多个部分并作为多部分上传发送到 S3。这提供了许多好处”
  • 我不认为你在这方面有什么运气?我遇到了同样的问题

标签: amazon-web-services amazon-s3 md5 checksum


【解决方案1】:

我也遇到过这个问题并进行了多次测试。终于找到了答案,并以我自己的方式进行了验证。如果你们知道更好的方法,请在这里告诉我。

话虽如此,这就是我解决问题的方法。

当您创建 S3 客户端时,您必须按如下方式创建它。

const s3 = new AWS.S3({ computeChecksums: true });

然后你可以像下面这样定义s3上传参数

 var fileData = Buffer.from(fileContentString, 'binary');
 var s3params = {
     Bucket: bucketName,
     Key: folderName + "/" + fileName,
     ContentType: 'binary',
     Body: fileData
 };

然后进行如下上传。

await s3.upload(s3params).promise()
        .then(data => {
            // use this log to verify whether the md5 checksum was verified
            console.log(`File uploadedd successfully ${JSON.stringify(data)}`);
            // handle success upload
        })
        .catch(error => {
            //handle the error
        });

上传成功后,这是我验证其工作的方式。

  • 检查 S3 中的项目。在文档详细信息中,对象概览部分检查 E-tag。您应该会看到类似 7e35f58f134d8914604c9fc6c35b2db7-9 的内容。 - 后面的这个数字表示上传了多少部分。对于更大的文件,应该有一个大于 1 的数字。在本例中为 9。

  • 检查控制台中的日志。 (上面代码中带有注释的日志。)您会看到类似下面的内容。

     {
     "Location": "https://bucketname.s3.region.amazonaws.com/folderName/fileName",
     "Bucket": "bucketName",
     "Key": "folderName/fileName",
     "ETag": "\"7e35f58f134d8914604c9fc6c35b2db7-9\""
    }
    
  • 如果您正在调试,您可以通过打印 s3 上传请求来进一步测试它。

     var uploadRequest = s3.upload(s3params);
     console.log(`S3 Request ${JSON.stringify(uploadRequest)}`);
    

    这将打印 s3 客户端配置。检查“computeChecksums”是否设置为 true。

我也尝试使用 s3.putObject 进行验证。但是,当我打印请求时,它并没有按预期向我显示标头中的 md5Checksum 配置。当我尝试以与第三点相同的方式记录整个对象以进行上传时,它也给了我循环 JSON 字符串化错误。所以我只打印了httpRequest。

var uploadRequest = s3.putObject(s3params);
console.log(`S3 Request ${JSON.stringify(uploadRequest.httpRequest)}`
//Following gives the JSON stringifying cyclic issue
//console.log(`S3 Request ${JSON.stringify(uploadRequest)}`);

如果有人能告诉我如何执行此操作并也可以使用 putObject 进行验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2014-05-03
    相关资源
    最近更新 更多