Safari - 删除对象时错误的 MD5 内容

Safari - wrong MD5-Content when deleting object

当我尝试使用 Chrome 删除存储桶中的对象时,它运行良好。 当我尝试使用 Safari 时,出现此错误:The Content-MD5 you specified did not match what we received.

这是来自 Chrome 的 curl 字符串:

curl 'https://mybucket.s3.cloud/?delete' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'X-Amz-User-Agent: aws-sdk-js/2.631.0 promise' -H 'Content-MD5: b0reU5O4x/fCQnk/W2oH4w==' -H 'Authorization: OK_STRING, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=OK_STRING' -H 'Content-Type: application/octet-stream; charset=UTF-8' -H 'X-Amz-Content-Sha256: UNSIGNED-PAYLOAD' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36' -H 'Sec-Fetch-Dest: empty' -H 'X-Amz-Date: 20200304T171137Z' -H 'Accept: */*' -H 'Origin: http://localhost:9000' -H 'Sec-Fetch-Site: cross-site' -H 'Sec-Fetch-Mode: cors' -H 'Referer: http://localhost:9000/myurl/explorer' -H 'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7' --data-binary '<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Object><Key>Capture d’écran 2020-03-03 à 17.46.22.png</Key></Object></Delete>' --compressed

现在这是与 Safari 相同的文件和相同的操作:

curl 'https://mybucket.s3.cloud/?delete' \
-XPOST \
-H 'Content-Type: application/octet-stream; charset=UTF-8' \
-H 'Accept: */*' \
-H 'Authorization: OK_STRING, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=OK_STRING' \
-H 'Accept-Language: fr-fr' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Host: mybucket.s3.cloud' \
-H 'Origin: http://localhost:9000' \
-H 'Content-Length: 138' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15' \
-H 'Referer: http://localhost:9000/' \
-H 'Connection: keep-alive' \
-H 'Content-MD5: b0reU5O4x/fCQnk/W2oH4w==' \
-H 'X-Amz-Date: 20200304T170853Z' \
-H 'X-Amz-User-Agent: aws-sdk-js/2.631.0 promise' \
-H 'X-Amz-Content-Sha256: UNSIGNED-PAYLOAD' \
--data-binary $'<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Object><Key>Capture d\u2019\xe9cran 2020-03-03 \xe0 17.46.22.png</Key></Object></Delete>'

生成这些调用的代码是:

s3({
      method: 'deleteObject',
      region: bucket.region,
      params: {
        Bucket: bucket.id,
        Key: file.Key,
        VersionId: file.VersionId,
      },
    })

s3 是实例 'aws-sdk/clients/s3'

有人知道会出什么问题吗? 看起来 Safari 正在根据 data-binary 对我的文件名进行编码。为什么?我怎样才能防止这种情况发生?还是在其他地方强制使用?

我找不到正确修复它的方法。但这与对象键中存在的一些特殊字符有关。这是 AWS 指南 https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-key-guidelines

我意识到我没有检查对象键。 所以我创建了一个正则表达式测试来过滤掉所有有问题的对象键。