从S3复制对象时出错 Golang "NoSuchKey:指定的键不存在"

0 人关注

我想把一个文件从一个文件夹复制到同一个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
    
6 个评论
你的变量的价值是什么?
它被写在右边的评论中
fabs
在你的例子中,变量 bucket 似乎没有被定义。
更新,谢谢你的指出 :)
你确定该文件存在吗?......你可以用CLI试试: docs.aws.amazon.com/cli/latest/reference/s3/cp.html
仔细检查 mybucket.test/folder1/folder2/a.pdf 是否绝对存在。如果是的话,我会在使用你的桶和路径变量之前,立即开始记录(或至少打印)这些变量。你的评论有助于理解 应该 发生的事情,但它们并不能保证这就是事实上发生的事情。如果没有明显的问题,请尝试用CLI手动进行同样的操作 :)
amazon-web-services
go
amazon-s3
SREERAG R NANDAN
SREERAG R NANDAN
发布于 2022-01-14
2 个回答
serge-v
serge-v
发布于 2022-01-20
0 人赞同

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

SREERAG R NANDAN
SREERAG R NANDAN
发布于 2022-01-20
已采纳
0 人赞同

使用 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),