Skip to content
大纲

拷贝Object

用户可以通过copyObject方法拷贝一个Object,如下代码所示:

python
fos_client.copy_object(source_bucket_name, source_object_key, target_bucket_name, target_object_key)

同步Copy功能

当前FOS的CopyObject接口是通过同步方式实现的。同步方式下,FOS端会等待Copy实际完成才返回成功。同步Copy能帮助用户更准确的判断Copy状态,但用户感知的复制时间会变长,且复制时间和文件大小成正比。

同步Copy方式更符合业界常规,提升了与其它平台的兼容性。同步Copy方式还简化了FOS服务端的业务逻辑,提高了服务效率。

分块拷贝

除了通过CopyObject接⼝拷贝文件以外,FOS还提供了另外一种拷贝模式——Multipart Upload Copy。归档类型文件如果是源Object,需要先取回归档类型文件。 用户可以在如下的应用场景内(但不仅限于此),使用Multipart Upload Copy,如:

  • 需要支持断点拷贝。
  • 拷贝超过5GB大小的文件。
  • 网络条件较差,和FOS的服务器之间的连接经常断开。

下面将介绍分步实现三步拷贝。 三步拷贝包含init、“拷贝分块”和complete三步,其中init和complete的操作同分块上传一致,可直接参考初始化Multipart Upload完成分块上传。 拷贝分块代码参考(参数定义可参考分块上传):

python
left_size = int(fos_client.get_object_meta_data(source_bucket,source_key).metadata.content_length)

#设置分块开始位置为left_size
#设置分块的开始偏移位置
offset = 0
part_number = 1
part_list = []
while left_size > 0:
    #设置每块为5MB
    part_size = 5 * 1024 * 1024
    if left_size < part_size:
        part_size = left_size

    response = fos_client.upload_part_copy(source_bucket, source_key, target_bucket, target_key, upload_id,part_number, part_size, offset)
    left_size -= part_size
    offset += part_size
    part_list.append({"partNumber": part_number,"eTag": response.etag})
    part_number += 1

注意:

  1. offset参数以字节为单位,为分块的开始偏移位置。
  2. size参数以字节为单位,定义每个分块的大小,除最后一个Part以外,其他的Part大小都要大于 5MB。