如何复制键中带有特殊字符的S3对象

Gar*_*day 6 amazon-s3 amazon-web-services node.js aws-sdk-nodejs

我的 S3 存储桶中有对象,但我无法控制键的名称。其中一些键具有特殊字符,AWS SDK 不喜欢它们。

\n\n

例如,一个对象键是:folder/\xe2\x80\x8dJohnson, Scott to JKL-Discovery.pdf,乍一看可能看起来不错,但如果我对它进行 URL 编码:folder%2F%E2%80%8DJohnson%2C+Scott+to+JKL-Discovery.pdf,您可以看到在之后folder/(或编码时)之前folder%2F有一个随机的字符序列。%E2%80%8DJohnson

\n\n

目前尚不清楚这些字符从何而来,但是,我需要能够处理这个用例。当我尝试使用 Node.js AWS SDK 复制该对象时,

\n\n
const copyParams = {\n    Bucket,\n    CopySource,\n    Key : `folder/\xe2\x80\x8dJohnson, Scott to JKL-Discovery.pdf`\n  };\n  let metadata = await s3.copyObject(copyParams).promise();\n
Run Code Online (Sandbox Code Playgroud)\n\n

它失败并且找不到对象,如果我有encodeURI()钥匙,它也会失败。

\n\n

我该如何处理这个问题?

\n\n

不要建议我更改键名中允许的字符。我无法控制这件事

\n

use*_*973 0

尝试你的字符串,有一个棘手的“零宽度空格”unicode 字符...\n http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=342+ 200+213&模式=字节

\n

我会清理字符串,删除 unicode 字符,然后按照官方文档的要求进行 url 编码。

\n
encodeURI(\'folder/\xe2\x80\x8djohnson, Scott to JKL-Discovery.pdf\'.replace(/[^\\x00-\\x7F]/g, ""))\n
Run Code Online (Sandbox Code Playgroud)\n