亚马逊S3 REST API文档指出,在PUT操作中上传的大小限制为5 5gb。大于该大小的文件必须使用multipart上传。很好。
但是,我本质上需要的是重命名可能比这个更大的文件。据我所知,没有重命名或移动操作,因此我必须将文件复制到新位置并删除旧文件。对于大于5 5gb的文件,这究竟是如何实现的?我必须从存储桶到其自身进行分块上传吗?在这种情况下,如何将文件拆分为多个部分?
从boto的源代码来看,它似乎不会自动为大于5 5gb的文件做这样的事情。有没有我错过的内置支持?
发布于 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)之外,没有记录所需的方法(虽然我自己还没有尝试过):
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。重点挖掘
发布于 2013-03-11 05:10:33
上面是非常接近工作的,不幸的是,应该以mp.complete_upload()而不是拼写错误的upload_complete()结束!
我已经在这里添加了一个有效的boto s3多部分复制脚本,基于AWS Java示例,并使用超过5 GiB的文件进行了测试:
发布于 2017-05-25 02:27:24
我发现这种方法可以上传大于5G的文件,并将其修改为使用Boto复制程序。原件如下: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()https://stackoverflow.com/questions/10355941
复制相似问题