我有使用ListObjectsPages
- > Contents
- > Key
列出密钥的代码,并使用CopyObject
复制这些密钥。这通常有效,但对于某些键,它会抱怨NoSuchKey: The specified key does not exist.
它所抱怨的一组键包含+
的键。
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
是正确的。我会用赏金来奖励唯一的当前答案,因为它会添加有用的信息,但不会选择它是正确的。
答案 0 :(得分:1)
object key and metadata document很清楚:
以下字符集通常可以安全地用于密钥名称:
- 字母数字字符
[0-9a-zA-Z]
- 特殊字符
!
,-
,_
,.
,*
,'
,(
和{{ 1}}
不仅+会被转换为空间,但是,从同一页面的“可能需要特殊处理的字符”部分,“)
”也应该从空间转换回来,{{3不做(它只将空格转换回:
)。
检查您的密钥是否包含要谨慎处理的其他特殊字符,例如+
(也替换为空格),:
或@
(替换为=
) ,或;
和,
。
特别检查从?
获得的密钥是否在原始密钥中有+而不是“QueryUnescape
”:这可能是一个错误地“未转义”的空格。
答案 1 :(得分:0)
详细说明了发生的情况:https://github.com/aws/aws-sdk-go/issues/1438
CopySource
需要进行网址编码而不 Key
字段,这对我来说很惊讶。 (我正在对两者进行网址编码。)path.Join
来删除尾随\
。这是一个问题,因为s3键可以有尾随\
- 它代表一种文件夹。