据我所知,没有重命名或移动操作,因此我有
将文件复制到新位置并删除旧位置。
没错,对于小于 5 GB 的对象/文件,通过 PUT Object - Copy 操作,然后是 DELETE Object 操作(当然,boto 支持这两种操作,请参阅 @ 987654324@和delete_key()):
PUT 操作的这个实现创建了一个对象的副本
已存储在 Amazon S3 中。一个 PUT 复制操作是一样的
就像执行 GET 然后执行 PUT。添加请求标头,
x-amz-copy-source,使 PUT 操作将源对象复制到
目标存储桶。
但是,对于大于 5 GB 的对象/文件,这确实是不可能的:
注意
[...] 您可以在单个原子中创建最大 5 GB 的对象副本
使用此 API 进行操作。 但是,对于复制大于
5 GB,您必须使用分段上传 API。对于概念
信息[...],转到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 不会被保留
并为发出请求的用户设置为私有。覆盖
默认 ACL 设置,使用 x-amz-acl 标头指定新的 ACL
生成复制请求时。有关更多信息,请参阅 Amazon S3
ACL。 [强调我的]