您可以通过拷贝方法将文件从一个存储空间(源存储空间)复制到同一地域的另一个存储空间(目标存储空间)中。

拷贝时限制条件如下:

  • 用户有源文件的读写权限。
  • 不支持跨地域拷贝。例如,不支持将杭州存储空间里的文件拷贝到青岛。

简单拷贝

对于小于1GB的文件,您可以使用简单拷贝。以下代码用于简单拷贝:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://console.cloud.tmall.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourDestinationBucketName>')

bucket.copy_object('<yourSourceBucketName>', '<yourSourceObjectName>', '<yourDestinationObjectName>')

拷贝大文件

对于大于1GB的文件,需要使用分片拷贝(UploadPartCopy)。分片拷贝分为三步:

  1. 通过bucket.init_multipart_upload初始化分片拷贝任务。
  2. 通过bucket.upload_part_copy进行分片拷贝。除最后一个分片外,其它分片都要大于100KB。
  3. 通过bucket.complete_multipart_upload提交分片拷贝任务。

以下代码用于分片拷贝。

# -*- coding: utf-8 -*-
import oss2
from oss2.models import PartInfo
from oss2 import determine_part_size

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://console.cloud.tmall.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

src_object = '<yourSourceObjectName>'
dst_object = '<yourDestinationObjectName>'

total_size = bucket.head_object(src_object).content_length
part_size = determine_part_size(total_size, preferred_size=100 * 1024)

# 初始化分片。
upload_id = bucket.init_multipart_upload(dst_object).upload_id
parts = []

# 逐个分片拷贝。
part_number = 1
offset = 0
while offset < total_size:
    num_to_upload = min(part_size, total_size - offset)
    byte_range = (offset, offset + num_to_upload - 1)

    result = bucket.upload_part_copy(bucket.bucket_name, src_object, byte_range,dst_object, upload_id, part_number)
    parts.append(PartInfo(part_number, result.etag))

    offset += num_to_upload
    part_number += 1

# 完成分片拷贝。
bucket.complete_multipart_upload(dst_object, upload_id, parts)

分片拷贝的详细说明请参见UploadPartCopy