【问题标题】:Error while copying object from S3 Golang "NoSuchKey: The specified key does not exist"从 S3 Golang 复制对象时出错“NoSuchKey:指定的键不存在”
【发布时间】:2022-01-14 09:29:41
【问题描述】:

我想将文件从一个文件夹复制到同一个 S3 存储桶上的另一个文件夹。执行此操作时出现错误NoSuchKey: The specified key does not exist 我的代码如下所示。

sess, err := session.NewSession(&aws.Config{Region: aws.String("ap-south-1")})
if err != nil {
    return nil, err
}
Oldpath := "folder1/folder2/a+b.pdf"
newBaseFolder  := "folder3"
svc := s3.New(sess)
bucketName := "mybucket.test"
source := bucketName + "/" + oldPath                                 // Oldpath = "folder1/folder2/a+b.pdf"
                                                                     //newBaseFolder = "folder3"
newPath := newBaseFolder + "/" + strings.SplitN(oldPath, "/", 2)[1] //newPath = "folder3/folder2/a+b.pdf" 
_, err = svc.CopyObject(&s3.CopyObjectInput{
            Bucket:     aws.String(bucketName), // bucketName = "mybucket.test" 
            CopySource: aws.String(url.PathEscape(source)),
            Key:        aws.String(newPath)})
if err != nil {
        return nil, err
    }

错误信息

{
"err": "NoSuchKey: The specified key does not exist."
"status code": 404
}

【问题讨论】:

  • 你的变量的值是多少?
  • 右边写成cmets
  • 在您的示例中,变量bucket 似乎未定义。
  • 已更新,谢谢指出:)
  • 再次检查mybucket.test/folder1/folder2/a.pdf 确实存在。如果是,我会在您使用它们之前立即记录(或至少打印)您的存储桶和路径变量。您的 cmets 有助于了解 假定 正在发生的事情,但他们不保证这实际上是正在发生的事情。如果没有明显问题,请使用 CLI 手动尝试相同的操作 :)

标签: amazon-web-services go amazon-s3


【解决方案1】:

可能的原因是url.PathEscape 将路径中的斜杠替换为%2F

【讨论】:

    【解决方案2】:

    使用url.QueryEscape 而不是url.PathEscape,因为url.QueryEscape 可以编码特殊字符,例如+,而url.PathEscape 无法编码(这种技术对我有用)。

    ...
    _, err := svc.CopyObject(
                &s3.CopyObjectInput{
                    Bucket:     aws.String("document.as.a.service.test"),
                    CopySource: aws.String(url.QueryEscape(source)),
                    Key: aws.String(newPath),
                },
            )
    ...
    

    有时如果copySource没有正确编码,错误会显示为NoSuchKey: The specified key does not exist

    为了避免混淆,Go-AWS-SDK copyObject 函数 copySource 将是现有文件的路径Key 是新路径或目标你希望你的文件被复制

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多