go – 如何列出和复制带有非字母数字字符的s3键?

我有使用ListObjectsPages-> Contents-> Key列出密钥的代码,并使用CopyObject复制这些密钥.这通常有效,但对于某些键,它抱怨NoSuchKey:指定的键不存在.它抱怨的一组按键包括按键.

> ListObjectsPages返回键“foo bar”.
> CopyObject on“foo bar”给出了NoSuchKey错误.
> CopyObject on“foo bar”(未转义)给出了NoSuchKey错误.

奇怪的是,如果我在“foo bar”上使用CLI:aws s3 cp,则副本可以正常工作.但是我无法使用CLI.我需要使用sdk.

我正在使用v1.8.11

正如Rayfen所说,加号可能是空间替换的结果.

更新:
一切都在这里被淘汰https://github.com/aws/aws-sdk-go/issues/1438. Rayfen对于需要QueryEscape是正确的.我将用赏金奖励唯一的当前答案,因为它添加了有用的信息,但没有选择它是正确的.

最佳答案
object key and metadata document很清楚:

The following character sets are generally safe for use in key names:

  • Alphanumeric characters [0-9a-zA-Z]
  • Special characters !, -, _, ., *, ', (, and )

不仅可以转换为空间,但是,从同一页面的“可能需要特殊处理的字符”部分,“:”也应该从空间转换回来,而QueryUnescape不会这样做(它只会将空间转换回).

检查您的密钥是否包含要小心处理的其他特殊字符,例如:(也用空格替换),@或=(替换为;),或,和?.

特别检查从QueryUnescape获得的密钥是否在原始密钥中具有而不是“:”:这可能是错误地“未转义”的空格.

点赞