Amazon web services 使用多端口复制S3对象
我需要在AWSS3中重命名相当多的对象。对于小对象,以下代码段可以完美地工作: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
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年后,我遇到了同样的问题,最后我问了这个问题。。。