分块复制

最近更新时间: 2024-10-17 17:10:00

适用场景

当需要复制一个超过 5 GB 的对象时,您需要选择分块复制的方法来实现。使用分块上传的 API 来创建一个新的对象,并使用 Part Copy 的功能,携带 x-cos-copy-source 头部来指定源对象,流程包括:

  1. 初始化一个分块上传的对象。

  2. 复制源对象的数据,可指定 x-cos-copy-range 头部,每次只可复制最多 5 GB 数据。

  3. 完成分块上传。

使用云平台 COS 提供的 SDK 可以轻松完成分块复制的功能。

使用方法

使用 Java SDK

对象存储 COS 的 Java SDK 中提供了此方法,可参考 Java SDK 接口文档拷贝文件部分 。

步骤说明

  1. 初始化客户端 cosclient。

  2. 使用 TransferManager 中提供的高级 API copy 接口来完成拷贝。

代码示例

对于 5G 以上的文件,需要通过分块上传中的 copypart 来实现,步骤较多,因此在 TransferManager 中封装了一个 copy 接口,不仅能根据文件大小自动的选择接口,同时能支持 5G 以上的文件拷贝。推荐使用该接口进行文件的 copy。示例代码如下:


// 1 初始化用户身份信息(secretId, secretKey)  
COSCredentials cred = new BasicCOSCredentials("AKIDXXXXXXXX",   "1A2Z3YYYYYYYYYY");  
// 2 设置bucket的区域, COS地域的简称请参照 /document/product/436/6224  
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing-1"));  
// 3 生成cos客户端  
COSClient cosclient = new COSClient(cred, clientConfig);  


ExecutorService threadPool = Executors.newFixedThreadPool(32);  
// 传入一个threadpool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池。  
TransferManager transferManager = new TransferManager(cosclient, threadPool);

// 要拷贝的bucket region, 支持跨园区拷贝  
Region srcBucketRegion = new Region("ap-shanghai");  
// 源bucket, bucket名需包含appid  
String srcBucketName = "srcBucket-1251668577";
// 要拷贝的源文件  
String srcKey = "aaa/bbb.txt";
// 目的bucket, bucket名需包含appid  
String destBucketName = "destBucket-1251668577";
// 要拷贝的目的文件  
String destKey = "ccc/ddd.txt";

CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketRegion, srcBucketName,
        srcKey, destBucketName, destKey);
try {
    Copy copy = transferManager.copy(copyObjectRequest);  
    // 返回一个异步结果copy, 可同步的调用waitForCopyResult等待copy结束, 成功返回CopyResult, 失败抛出异常.  
    CopyResult copyResult = copy.waitForCopyResult();  
} catch (CosServiceException e) {
    e.printStackTrace();
} catch (CosClientException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

transferManager.shutdownNow();
cosclient.shutdown();