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

时间:2017-07-26 21:08:31

标签: go amazon-s3 character-encoding

我有使用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是正确的。我会用赏金来奖励唯一的当前答案,因为它会添加有用的信息,但不会选择它是正确的。

2 个答案:

答案 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

  1. 主要问题是CopySource需要进行网址编码而 Key字段,这对我来说很惊讶。 (我正在对两者进行网址编码。)
  2. 另一个问题是我使用了path.Join来删除尾随\。这是一个问题,因为s3键可以有尾随\ - 它代表一种文件夹。