据我所知,没有重命名或移动操作,因此我必须将文件复制到新位置并删除旧位置。
没错,对于小于 5 GB 的对象/文件,通过PUT Object - Copy操作,然后是DELETE Object操作很容易做到(当然,这两者都在boto中受支持,请参阅copy_key()和delete_key( ) ):
PUT 操作的这种实施会创建已存储在 Amazon S3 中的对象的副本。PUT 复制操作与执行 GET 然后执行 PUT 相同。添加请求标头 x-amz-copy-source 会使 PUT 操作将源对象复制到目标存储桶中。
但是,对于大于 5 GB 的对象/文件,这确实是不可能的:
注意
[...] 您可以使用此 API 在单个原子操作中创建最大 5 GB 的对象副本。但是,要复制大于 5 GB 的对象,您必须使用分段上传 API。有关概念信息 [...],请转到使用分段上传上传对象[...] [强调我的]
同时,Boto 也通过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 中实现此目的的相应示例,这可能会提供对一般方法的更多见解,请参阅 使用 Multipart Upload API 复制对象。
祝你好运!
附录
请注意以下关于一般复制的特殊性,很容易被忽视:
复制对象时,您可以保留大部分元数据(默认)或指定新元数据。但是,ACL 不会保留,并为发出请求的用户设置为私有。要覆盖默认 ACL 设置,请在生成复制请求时使用 x-amz-acl 标头指定新 ACL。有关更多信息,请参阅 Amazon S3 ACL。[强调我的]