复制对象

复制对象

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")