复制对象
copy_object操作用于创建一个已经在媒体存储中的对象。使用copy_object可以复制单个最大为5GB的对象。执行copy_object操作,必须具有对被拷贝对象的READ权限和对目标bucket的WRITE权限。
def copy_object():
try:
resp = s3_client.copy_object(
Bucket='TARGET_BUCKET_NAME', # 目标Bucket
Key='TARGET_KEY', # 目标Key
CopySource={'Bucket': 'SOURCE_BUCKET_NAME', 'Key': 'SOURCE_KEY'} # 复制对象的原始Bucket和Key
)
print(resp)
except ClientError as e:
logging.error(e)
文件比较大(超过1GB)的情况下,直接使用copyObject 可能会出现超时,需要使用分片复制的方式进行文件复制。TransferManager封装了分片复制的接口,可以用于复制文件。
class TransferDemo(object):
def __init__(self):
config = botocore.config.Config(
signature_version='s3v4', # s3 or s3v4
)
self.bucket = s3config.bucket
session = botocore.session.get_session()
self.s3_client = session.create_client(
's3',
aws_access_key_id=s3config.access_key,
aws_secret_access_key=s3config.secret_key,
endpoint_url=s3config.end_point,
config=config)
MB = 1024 * 1024
transConfig = s3transfer.manager.TransferConfig(
multipart_threshold=5 * MB, # 大于该值使用分片上传
multipart_chunksize=5 * MB, # 分片大小
max_request_concurrency=2,
)
# 设置带宽,不填表示不限制
# transConfig.max_bandwidth = 1 * MB
self.transfer = s3transfer.manager.TransferManager(self.s3_client, transConfig)
def copy(self):
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'), "copy start")
source={'Bucket': self.bucket, 'Key': 'ExampleObject.txt'}
dstBucket = self.bucket
dstKey = 'ExampleObject1.txt'
# 扩展配置
extraArgs = {'ContentType': 'text/plain', 'ACL': 'public-read'}
future = self.transfer.copy(source, dstBucket, dstKey, extra_args=extraArgs)
future.result()
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'), "copy success")