首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在亚马逊S3中复制大于5 GB的文件?

如何在亚马逊S3中复制大于5 GB的文件?
EN

Stack Overflow用户
提问于 2012-04-28 02:29:22
回答 4查看 23.6K关注 0票数 26

亚马逊S3 REST API文档指出,在PUT操作中上传的大小限制为5 5gb。大于该大小的文件必须使用multipart上传。很好。

但是,我本质上需要的是重命名可能比这个更大的文件。据我所知,没有重命名或移动操作,因此我必须将文件复制到新位置并删除旧文件。对于大于5 5gb的文件,这究竟是如何实现的?我必须从存储桶到其自身进行分块上传吗?在这种情况下,如何将文件拆分为多个部分?

从boto的源代码来看,它似乎不会自动为大于5 5gb的文件做这样的事情。有没有我错过的内置支持?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-28 23:57:26

据我所知,没有重命名或移动操作,因此我必须将文件复制到新位置并删除旧文件。

没错,对于小于5 GB的对象/文件,很容易通过PUT Object - Copy操作,然后是DELETE Object操作(当然,在boto中都支持这两种操作,请参阅copy_key()delete_key()):

这个PUT操作的实现创建了一个已经存储在

S3中的对象的副本。PUT copy操作与先执行GET,然后执行PUT相同。添加请求头x-amz- copy -source会使PUT操作将源对象复制到目标存储桶中。

但是,对于大于5 GB的对象/文件,这确实是不可能的:

备注

..。您可以使用此API在单个原子操作中创建大小不超过5 GB的对象的副本。但复制大于5 GB的对象时,必须使用分块上传接口。有关概念信息...,请转到Uploading Objects Using Multipart Upload ...强调我的

同时,Boto也通过copy_part_from_key()方法来支持这一点;不幸的是,在相应的pull request #425 (allow for multi-part copy commands)之外,没有记录所需的方法(虽然我自己还没有尝试过):

代码语言:javascript
复制
import boto
s3 = boto.connect_s3('access', 'secret')
b = s3.get_bucket('destination_bucket')
mp = b.initiate_multipart_upload('tmp/large-copy-test.mp4')
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 1, 0, 999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 2, 1000000000, 1999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 3, 2000000000, 2999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 4, 3000000000, 3999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 5, 4000000000, 4999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 6, 5000000000, 5500345712)
mp.complete_upload()

您可能希望研究各自的示例,了解如何最终在Java或.NET中实现这一点,这可能会更深入地了解一般的方法,请参阅Copying Objects Using the Multipart Upload API

祝好运!

附录

请注意以下有关复制的一般特性,这些特性很容易被忽略:

复制对象时,可以保留大多数元数据(默认)或指定新元数据。但是,对于发出请求的用户,不会保留,并被设置为私有。要覆盖默认ACL设置,请在生成拷贝请求时使用x-amz-acl标头指定新的ACL。有关更多信息,请参阅亚马逊S3 ACL。重点挖掘

票数 22
EN

Stack Overflow用户

发布于 2013-03-11 05:10:33

上面是非常接近工作的,不幸的是,应该以mp.complete_upload()而不是拼写错误的upload_complete()结束!

我已经在这里添加了一个有效的boto s3多部分复制脚本,基于AWS Java示例,并使用超过5 GiB的文件进行了测试:

https://gist.github.com/joshuadfranklin/5130355

票数 10
EN

Stack Overflow用户

发布于 2017-05-25 02:27:24

我发现这种方法可以上传大于5G的文件,并将其修改为使用Boto复制程序。原件如下:http://boto.cloudhackers.com/en/latest/s3_tut.html

代码语言:javascript
复制
import math
from boto.s3.connection import S3Connection
from boto.exception import S3ResponseError


conn = S3Connection(host=[your_host], aws_access_key_id=[your_access_key],
                    aws_secret_access_key=[your_secret_access_key])

from_bucket = conn.get_bucket('your_from_bucket_name')
key = from_bucket.lookup('my_key_name')
dest_bucket = conn.get_bucket('your_to_bucket_name')

total_bytes = key.size
bytes_per_chunk = 500000000

chunks_count = int(math.ceil(total_bytes/float(bytes_per_chunk)))
file_upload = dest_bucket.initiate_multipart_upload(key.name)
for i in range(chunks_count):
    offset = i * bytes_per_chunk
    remaining_bytes = total_bytes - offset
    print(str(remaining_bytes))
    next_byte_chunk = min([bytes_per_chunk, remaining_bytes])
    part_number = i + 1
    file_upload.copy_part_from_key(dest_bucket.name, key.name, part_number,
                                   offset, offset + next_byte_chunk - 1)
file_upload.complete_upload()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10355941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档