2009-09-23 92 views

回答

2

S3允许按对象复制对象。 当您指定源对象的密钥和存储桶以及目标目标的密钥和存储桶时,CopyObject操作会创建一个对象的副本。 不确定boto是否具有紧凑的实现。

4

浏览boto的源代码我发现Key对象有一个“复制”方法。感谢您关于CopyObject操作的建议。

+0

帮助对方法副本模块boto.s3.key: '拷贝(个体,dst_bucket,dst_key,元数据=无,reduced_redundancy =假,preserve_acl =假,encrypt_key =假)的Boto'方法。 s3.key.Key实例 将此密钥复制到另一个存储桶。 – 2012-05-25 07:31:34

14

凡斗是斗目的地:

bucket.copy_key(new_key,source_bucket,source_key) 
+1

这实际上读取密钥并将其放入新存储区 - 这不是您想要的。抱歉。 – 2010-03-10 16:05:19

+0

我不相信这是准确的。这是IMO的最佳答案。 'copy_key'方法在PUT请求中传递'x-amz-copy-source'头,它告诉S3直接从区域复制到区域,而不需要下载到你的机器上。 – sergiopereira 2015-08-15 19:20:10

+0

这里是他们的文档:http://boto.cloudhackers.com/en/latest/ref/s3.html#boto.s3.bucket.Bucket.copy_key – creimers 2016-03-25 00:45:04

2

虽然没人问,我想这可能是相关的,以显示如何使用simples3做到这一点:

>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public") 

我不知道是什么博托在这里做,但值得注意的是,权限(ACL)而不是被S3复制,如果没有其他指定,它将被重置为“私有”。要复制ACL,你必须首先要求它。

+0

我第二次评论这个权限(遇到一个bug后)'dest_bucket .copy_key(key.name,src_bucket_name,key.name,preserve_acl = True)' – nsof 2014-09-01 14:18:39

0

请注意,Key对象上的'copy'方法具有“preserve_acl”参数(默认为False),该参数将将源ACL复制到目标对象。

9
from boto.s3.key import Key 

#Get source key from bucket by name 
source_key = source_bucket.get_key(source_key_name) 

#Copy source key to a new bucket with a new key name (can be the same as source) 
#Note: source_key is Key 
source_key.copy(dest_bucket_name,dest_key_name) 

#The signature of boto's Key class: 
def copy(self, dst_bucket, dst_key, metadata=None, 
      reduced_redundancy=False, preserve_acl=False, 
      encrypt_key=False, validate_dst_bucket=True) 

#set preserve_acl=True to copy the acl from the source key