【发布时间】:2010-11-30 16:48:29
【问题描述】:
我的 S3 存储桶中的密钥中包含一个文件。我想创建一个包含相同文件的新密钥。是否可以不下载该文件? 我正在寻找 Python 中的解决方案(最好是 boto 库)。
【问题讨论】:
我的 S3 存储桶中的密钥中包含一个文件。我想创建一个包含相同文件的新密钥。是否可以不下载该文件? 我正在寻找 Python 中的解决方案(最好是 boto 库)。
【问题讨论】:
S3 允许逐个对象复制。 当您指定源对象的键和存储桶以及目标目标的键和存储桶时,CopyObject 操作会创建对象的副本。 不确定 boto 是否有紧凑的实现。
【讨论】:
浏览boto的源码发现Key对象有一个“复制”的方法。感谢您对 CopyObject 操作的建议。
【讨论】:
copy(self, dst_bucket, dst_key, metadata=None, reduced_redundancy=False, preserve_acl=False, encrypt_key=False)boto.s3.key.Key实例的方法将此Key复制到另一个桶。
其中bucket是目标bucket:
bucket.copy_key(new_key,source_bucket,source_key)
【讨论】:
copy_key 方法在 PUT 请求中传递 x-amz-copy-source 标头,这告诉 S3 直接从一个区域复制到另一个区域,而不是下载到您的机器上。
虽然没有人问,但我认为展示如何使用 simples3 执行此操作可能是相关的:
>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public")
我不确定 Boto 在这里做了什么,但值得注意的是权限 (ACL)不会被 S3 复制,如果没有指定其他内容,它将被重置为“私有” .要复制 ACL,您必须先请求它。
【讨论】:
dest_bucket.copy_key(key.name, src_bucket_name, key.name, preserve_acl=True)
请注意,Key 对象上的“复制”方法有一个“preserve_acl”参数(默认为 False),它将源的 ACL 复制到目标对象。
【讨论】:
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
【讨论】: