高级复制文件对象(
copy)。SDK 查询源文件后选择直接复制或分块复制,分块路径自动组织上传分块与最终完成请求。注意事项
操作的存储桶应处于 Available 状态;传输失败可能表现为服务端、客户端或本地文件异常,处理方式见 Python SDK 异常处理。
仅支持同桶、同地域的文件对象复制;源 Bucket 与目标 Bucket 相同,CopySource.Region 与客户端 Region 相同。对象键尾斜杠严格区分类型,不支持目录复制;源类型不匹配按不存在处理。由于包含源 HEAD,高级接口可能先返回 HTTP 404,而不是低层复制接口的参数错误。
默认复制阈值为 5GB;按本文示例不传 StorageClass 时,当前高性能桶通常在小于阈值时直接复制,达到阈值时分块复制。不要将 PartSize 当作选择分块复制的阈值。
显式传入与源一致的 StorageClass 可能优先选择直接复制,不受大小阈值控制;超大文件可能因此超过直接复制的 5GB 限制。需要可靠控制每个步骤时,请使用手动分块复制接口。
分块复制期间请保持源文件不变;本接口不提供对象版本快照。高性能桶不支持 CopySource.VersionId。
ForbidOverwrite='true' 同时用于直接复制和最终 Complete;省略或传 "false" 允许覆盖已有文件。防覆盖失败时不能通过删除参数重试来保持原保护要求。CopyStatus 的元数据复制方式仅用于直接复制路径。分块路径的目标元数据来自本次初始化请求,不自动继承源对象元数据;需要保留时先查询源元数据,再将实际需要的 ContentType、Metadata 等显式传入。直接复制时若要用本次参数替换源元数据,还需设置 CopyStatus='Replaced'。本接口不自动恢复上次失败的复制任务,也没有本地进度回调参数。分块失败可能遗留未完成任务;Complete 抛错时会尝试终止该任务,但不能保证任意失败都自动清理。响应丢失时先核对目标对象状态,放弃任务时按明确的 UploadId 清理。
请求
方法原型
def copy(self, Bucket, Key, CopySource, CopyStatus='Copy', PartSize=10, MAXThread=5, **kwargs)
参数说明
参数 | 说明 | 类型 | 是否必选 |
Bucket | 高性能桶完整名称,例如 examplebucket-x--1250000000 | string | 是 |
Key | 文件对象键,不以 / 结尾 | string | 是 |
CopySource | 字典,含 Bucket、Key、Region;源键不以 / 结尾 | dict | 是 |
CopyStatus | Copy(默认)或 Replaced;仅直接复制路径的元数据策略 | string | 否 |
PartSize | 分块复制大小,正整数,默认 10,单位 MB;每块不超过 5GB | int | 否 |
MAXThread | 分块复制并发线程数,正整数,默认 5 | int | 否 |
ForbidOverwrite | 关键字参数,仅 "true" / "false" | string | 否 |
ContentType / Metadata | 显式设置的目标元数据;自定义元数据键以 x-cos-meta- 开头 | string / dict | 否 |
kwargs | 可选请求参数,使用本文列出的参数;按本页示例不传 StorageClass | dict | 否 |
响应
返回字典,可读取
ETag;其他字段随直接复制或 Complete 路径而异,不承诺返回可访问的 Location URL。错误码
实际案例
# -*- coding: utf-8 -*-import osfrom qcloud_cos import CosConfig, CosS3Client# 高性能桶经 VPC 内网 HTTP 80 端口接入,SDK 的网关 DNS 负载均衡也仅对 HTTP 请求生效;SDK 默认 https,此处需显式指定 http。config = CosConfig(Scheme='http', Region='ap-guangzhou',SecretId=os.environ['COS_SECRET_ID'],SecretKey=os.environ['COS_SECRET_KEY'],Token=os.environ.get('COS_SECURITY_TOKEN'),EnableRapidDomain=True)client = CosS3Client(config)bucket = 'examplebucket-x--1250000000'result = client.copy(Bucket=bucket, Key='copies/report.bin',CopySource={'Bucket': bucket, 'Key': 'uploads/report.bin', 'Region': 'ap-guangzhou'},PartSize=8, MAXThread=4, ForbidOverwrite='true')print('copy completed, ETag: %s' % result['ETag'])# 本例复制文件内容;如需保留源元数据,请按本页注意事项显式设置。