分块复制
最近更新时间: 2024-10-17 17:10:00
适用场景
当需要复制一个超过 5 GB 的对象时,您需要选择分块复制的方法来实现。使用分块上传的 API 来创建一个新的对象,并使用 Part Copy 的功能,携带 x-cos-copy-source
头部来指定源对象,流程包括:
初始化一个分块上传的对象。
复制源对象的数据,可指定
x-cos-copy-range
头部,每次只可复制最多 5 GB 数据。完成分块上传。
使用云平台 COS 提供的 SDK 可以轻松完成分块复制的功能。
使用方法
使用 Java SDK
对象存储 COS 的 Java SDK 中提供了此方法,可参考 Java SDK 接口文档拷贝文件部分 。
步骤说明
初始化客户端 cosclient。
使用 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();