亚马逊S3 REST API文档说,有5GB的上传在PUT操作的大小限制。 比更大的文件必须使用多被上传。 精细。
不过,我需要在本质上是重命名,可能是比更大的文件。 据我知道有没有重命名或移动操作,因此,我必须将文件复制到新的位置并删除旧的。 究竟如何,是与比5GB大的文件呢? 我要做的从桶中多上传到自己? 在这种情况下,如何在分割部分文件的工作?
从阅读博托的源似乎并不像它超过5GB大的文件做这样的事会自动。 有没有办法,我错过任何内置支持?
亚马逊S3 REST API文档说,有5GB的上传在PUT操作的大小限制。 比更大的文件必须使用多被上传。 精细。
不过,我需要在本质上是重命名,可能是比更大的文件。 据我知道有没有重命名或移动操作,因此,我必须将文件复制到新的位置并删除旧的。 究竟如何,是与比5GB大的文件呢? 我要做的从桶中多上传到自己? 在这种情况下,如何在分割部分文件的工作?
从阅读博托的源似乎并不像它超过5GB大的文件做这样的事会自动。 有没有办法,我错过任何内置支持?
据我知道有没有重命名或移动操作,因此,我必须将文件复制到新的位置并删除旧的。
这是正确的,这是很容易的对象/文件大于5 GB的一个方式做PUT对象-复制操作,随后删除对象的操作(这两者在支持博托当然,看到copy_key()和delete_key( ) ):
在PUT这种操作实现创建了已存储在Amazon S3的一个对象的副本。 认沽复制操作是一样的执行GET,然后PUT。 加入请求报头,X-AMZ-复制源,使得PUT操作将源对象复制到目标桶。
然而,这确实是不可能的对象/文件大于5 GB的:
注意
[...]您在使用此API单个原子操作创建对象了的大小副本5 GB。 然而,对于复制对象大于5 GB,则必须使用多上传API。 对于概念性信息[...],请使用多部分上传载物件 [...] [重点煤矿]
博托同时支持这个问题,以及由所述的装置copy_part_from_key()方法; 不幸的是,所需的办法未记录相应的外拉请求#425(允许多部分的复制命令) (我没有尝试过这个自己尚未虽然):
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实现这一最终的各样本,这可能提供更深入地了解的一般方法,请参阅复制使用多部分上传API对象 。
祝好运!
请注意,一般就复制下面的特点,这是容易被忽视的:
当复制一个对象,你可以保留大部分的元数据(默认)或指定新的元数据。 然而,ACL不保留并设定为私人的发出请求的用户 。 要覆盖缺省ACL设置,使用x-AMZ-ACL头产生一个复制请求时,指定一个新的ACL。 欲了解更多信息,请参阅Amazon S3的访问控制列表。 [重点煤矿]
以上是非常接近的工作,遗憾的是应该已经结束mp.complete_upload()
而不是错字upload_complete()
我在这里增加了一个工作博托S3多拷贝剧本,基于AWS Java示例,并拥有超过5吉布文件进行测试:
https://gist.github.com/joshuadfranklin/5130355
我发现这个方法,才能上传5gigs更大的文件,并修改其与宝途复制过程的工作。 这里的原文: http://boto.cloudhackers.com/en/latest/s3_tut.html
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()