我怎样才能复制文件大于5 GB的Amazon S3的大?(How can I copy files

2019-07-29 04:31发布

亚马逊S3 REST API文档说,有5GB的上传在PUT操作的大小限制。 比更大的文件必须使用多被上传。 精细。

不过,我需要在本质上是重命名,可能是比更大的文件。 据我知道有没有重命名或移动操作,因此,我必须将文件复制到新的位置并删除旧的。 究竟如何,是与比5GB大的文件呢? 我要做的从桶中多上传到自己? 在这种情况下,如何在分割部分文件的工作?

从阅读博托的源似乎并不像它超过5GB大的文件做这样的事会自动。 有没有办法,我错过任何内置支持?

Answer 1:

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

这是正确的,这是很容易的对象/文件大于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的访问控制列表。 [重点煤矿]



Answer 2:

以上是非常接近的工作,遗憾的是应该已经结束mp.complete_upload()而不是错字upload_complete()

我在这里增加了一个工作博托S3多拷贝剧本,基于AWS Java示例,并拥有超过5吉布文件进行测试:

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



Answer 3:

我发现这个方法,才能上传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()


文章来源: How can I copy files bigger than 5 GB in Amazon S3?