Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用多端口复制S3对象_Amazon Web Services_Go_Amazon S3 - Fatal编程技术网

Amazon web services 使用多端口复制S3对象

Amazon web services 使用多端口复制S3对象,amazon-web-services,go,amazon-s3,Amazon Web Services,Go,Amazon S3,我需要在AWSS3中重命名相当多的对象。对于小对象,以下代码段可以完美地工作: input := &s3.CopyObjectInput{ Bucket: aws.String(bucket), Key: aws.String(targetPrefix), CopySource: aws.String(source), } _, err = svc.CopyObject(input) if err != nil { panic(err

我需要在AWSS3中重命名相当多的对象。对于小对象,以下代码段可以完美地工作:

input := &s3.CopyObjectInput{
    Bucket:     aws.String(bucket),
    Key:        aws.String(targetPrefix),
    CopySource: aws.String(source),
}
_, err = svc.CopyObject(input)
if err != nil {
    panic(errors.Wrap(err, "error copying object"))
}
对于较大的对象,我遇到了S3大小限制。我知道我需要使用多部分上传来复制对象。这就是我迄今为止所尝试的:

multiPartUpload, err := svc.CreateMultipartUpload(
    &s3.CreateMultipartUploadInput{
        Bucket: aws.String(bucket),
        Key: aws.String(targetPrefix), // targetPrefix is the new name
    },
)
if err != nil {
    panic(errors.Wrap(err, "could not create MultiPartUpload"))
}
resp, err := svc.UploadPartCopy(
    &s3.UploadPartCopyInput{
        UploadId:   multiPartUpload.UploadId,
        Bucket:     aws.String(bucket),
        Key:        aws.String(targetPrefix),
        CopySource: aws.String(source),
        PartNumber: aws.Int64(1),
    },
)
if err != nil {
    panic(errors.Wrap(err, "error copying multipart object"))
}
log.Printf("copied: %v", resp)
golang SDK向我施以援手:

InvalidRequest: The specified copy source is larger than the maximum allowable size for a copy source: 5368709120
我也尝试过以下方法,但我没有在此处列出任何零件:

multiPartUpload, err := svc.CreateMultipartUpload(
    &s3.CreateMultipartUploadInput{
        Bucket: aws.String(bucket),
        Key: aws.String(targetPrefix), // targetPrefix is the new name
    },
)
if err != nil {
    panic(errors.Wrap(err, "could not create MultiPartUpload"))
}
err = svc.ListPartsPages(
    &s3.ListPartsInput{
        Bucket:   aws.String(bucket),       // Required
        Key:      obj.Key,                  // Required
        UploadId: multiPartUpload.UploadId, // Required
    },
    // Iterate over all parts in the `CopySource` object
    func(parts *s3.ListPartsOutput, lastPage bool) bool {
        log.Printf("parts:\n%v\n%v", parts, parts.Parts)
        // parts.Parts is an empty slice
        for _, part := range parts.Parts {
            log.Printf("copying %v part %v", source, part.PartNumber)
            resp, err := svc.UploadPartCopy(
                &s3.UploadPartCopyInput{
                    UploadId:   multiPartUpload.UploadId,
                    Bucket:     aws.String(bucket),
                    Key:        aws.String(targetPrefix),
                    CopySource: aws.String(source),
                    PartNumber: part.PartNumber,
                },
            )
            if err != nil {
                panic(errors.Wrap(err, "error copying object"))
            }
            log.Printf("copied: %v", resp)
        }
        return true
    },
)
if err != nil {
    panic(errors.Wrap(err, "something went wrong with ListPartsPages!"))
}

我做错了什么或者我误解了什么?

我认为
ListPartsPages
是错误的方向,因为它适用于“多部分上传”,这是一个与s3“对象”不同的实体。因此,您正在将已上载的部分列出到刚才创建的多部分上载


您的第一个示例接近所需内容,但您需要手动将原始文件拆分为多个部分,每个部分的范围由
UploadPartCopyInput
CopySourceRange
指定。至少这是我从阅读文档中得到的。

你是说我需要手动循环并计算
UploadPartCopyInput
CopySourceRange
的值吗?这似乎可行,但。。。麻烦:(另外,道德上我是否需要投票并接受是否正确,但我真的很不喜欢AWS的人如何实现这个SDK?;)我是说,我认为如果你手动循环,它会起作用,并且粗略阅读api端点不会提供任何明显的替代方案。令人惊讶的是,他们在客户端库中没有任何抽象的细节。肯定应该添加到
s3/s3manager
…哦,真是太痛苦了。3年后,我遇到了同样的问题,最后我问了这个问题。。。