我有使用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获得的密钥是否在原始密钥中具有而不是“:”:这可能是错误地“未转义”的空格.