帮你快速理解、总结文档立即下载

递归复制与移动对象

最近更新时间:2026-10-22 17:31:33
我的收藏

简介

本文介绍对象存储 COS 通过 Java SDK 在智能体存储桶中递归复制目录、移动对象和递归移动目录的示例代码和描述。

注意事项

本文介绍的接口仅适用于智能体存储桶,普通存储桶的复制与移动请参见 复制与移动对象。
智能体存储桶相关接口需 COS Java SDK 5.6.283 及以上版本,SDK 的安装请参见 快速入门。
递归复制和递归移动会处理目录下的所有子文件和子目录,目录较大时,建议通过 clientConfig.setSocketTimeout 调大读取超时时间。

相关示例

功能名称
描述
示例代码
递归复制对象
将目录及其下的所有子文件和子目录复制到目标位置
移动对象
在同一存储桶内将文件或目录移动到目标位置
递归移动对象
将目录及其下的所有子文件和子目录移动到目标位置

前期准备

创建 COSClient

调用 COS 的接口之前,必须先创建一个 COSClient 的实例。
说明:
COSClient 实例是并发安全的,这里推荐一个进程只创建一个 COSClient 实例,当不会再通过这个实例发起请求的时候,再选择关闭这个实例。
// 创建 COSClient 实例,这个实例用来后续调用请求
COSClient createCOSClient() {
// 设置用户身份信息。
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
String secretId = System.getenv("secretId");//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

// ClientConfig 中包含了后续请求 COS 的客户端设置:
ClientConfig clientConfig = new ClientConfig();

// 设置 bucket 的地域
// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224
clientConfig.setRegion(new Region("COS_REGION"));

// 以下的设置,是可选的:

// 设置 socket 读取超时,默认 30s
// clientConfig.setSocketTimeout(30*1000);
// 设置建立连接超时,默认 30s
// clientConfig.setConnectionTimeout(30*1000);

// 如果需要的话,设置 http 代理,ip 以及 port
// clientConfig.setHttpProxyIp("httpProxyIp");
// clientConfig.setHttpProxyPort(80);

// 生成 cos 客户端。
return new COSClient(cred, clientConfig);
}

使用临时密钥创建 COSClient

如果要使用临时密钥请求 COS,则需要用临时密钥创建 COSClient 实例。
说明:
COSClient 实例是并发安全的,这里推荐一个进程只创建一个 COSClient 实例,当不会再通过这个实例发起请求的时候,再选择关闭这个实例。
使用临时密钥创建 COSClient 实例之前,需要先生成临时密钥,本 SDK 并不能生成临时密钥,而需要使用额外的操作来生成,参考 临时密钥生成及使用指引。
// 创建 COSClient 实例,这个实例用来后续调用请求
COSClient createCOSClient() {
// 这里需要已经获取到临时密钥的结果。
// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdk
String tmpSecretId = "TMPSECRETID";
String tmpSecretKey = "TMPSECRETKEY";
String sessionToken = "SESSIONTOKEN";

COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);

// ClientConfig 中包含了后续请求 COS 的客户端设置:
ClientConfig clientConfig = new ClientConfig();

// 设置 bucket 的地域
// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224
clientConfig.setRegion(new Region("COS_REGION"));

// 以下的设置,是可选的:

// 设置 socket 读取超时,默认 30s
// clientConfig.setSocketTimeout(30*1000);
// 设置建立连接超时,默认 30s
// clientConfig.setConnectionTimeout(30*1000);

// 如果需要的话,设置 http 代理,ip 以及 port
// clientConfig.setHttpProxyIp("httpProxyIp");
// clientConfig.setHttpProxyPort(80);

// 生成 cos 客户端。
return new COSClient(cred, clientConfig);
}

关闭 COSClient

当不会再通过一个 COSClient 实例发起请求的时候,请及时将其关闭,防止资源泄露。
cosClient.shutdown();

冲突解决策略

目标位置已存在同名目录或文件时,可通过 conflictResolutionStrategy 指定处理方式,不设置时按服务端默认策略处理。
取值
描述
适用接口
ConflictResolutionStrategy.ASK
目标已存在时,抛出异常 CosServiceException
copyObjectRecursive、moveObject、moveObjectRecursive
ConflictResolutionStrategy.RENAME
目标已存在时,自动重命名最后一级目录或文件
copyObjectRecursive、moveObject、moveObjectRecursive
ConflictResolutionStrategy.OVERWRITE
覆盖已存在的文件。冲突目标为目录时,抛出异常 CosServiceException
moveObject
递归复制和递归移动不支持 ConflictResolutionStrategy.OVERWRITE,传入时 SDK 抛出异常 IllegalArgumentException。

使用案例

递归复制对象

将目录及其下的所有子文件和子目录复制到目标位置(Copy Object Recursive)。

方法原型

public CopyObjectResult copyObjectRecursive(CopyObjectRecursiveRequest copyObjectRecursiveRequest)
throws CosClientException, CosServiceException;

请求示例

// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
// 详细代码参见本页:前期准备 -> 创建 COSClient
COSClient cosClient = createCOSClient();

// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
// 源目录与目标目录的对象键
String sourceKey = "my-space/aaa";
String destinationKey = "my-space/bbb";

CopyObjectRecursiveRequest copyObjectRecursiveRequest =
new CopyObjectRecursiveRequest(bucketName, sourceKey, bucketName, destinationKey);
// 目标已存在时自动重命名
copyObjectRecursiveRequest.setConflictResolutionStrategy(ConflictResolutionStrategy.RENAME);

try {
CopyObjectResult copyObjectResult = cosClient.copyObjectRecursive(copyObjectRecursiveRequest);
String etag = copyObjectResult.getETag();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 确认本进程不再使用 cosClient 实例之后,关闭即可
cosClient.shutdown();

参数说明

参数名称
描述
类型
copyObjectRecursiveRequest
递归复制请求
CopyObjectRecursiveRequest
Request 成员说明:
参数名称
描述
类型
sourceBucketName
源存储桶名称,Bucket 的命名格式为 BucketName-APPID ,详情请参见 命名规范
String
sourceKey
源目录的对象键,例如 my-space/aaa
String
destinationBucketName
目标存储桶名称,Bucket 的命名格式为 BucketName-APPID ,详情请参见 命名规范
String
destinationKey
目标目录的对象键,例如 my-space/bbb
String
conflictResolutionStrategy
冲突解决策略,可选值为 ASK、RENAME,详情请参见本文 冲突解决策略
ConflictResolutionStrategy

返回结果说明

成功:返回 CopyObjectResult,包含目标对象的 ETag、最后修改时间等信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
CopyObjectResult 成员说明:
参数名称
描述
类型
eTag
目标对象的 ETag
String
lastModifiedDate
目标对象的最后修改时间
Date
crc64Ecma
目标对象的 CRC64 值
String

移动对象

在同一存储桶内将文件或目录移动到目标位置(Move Object)。

方法原型

public MoveObjectResult moveObject(MoveObjectRequest moveObjectRequest)
throws CosClientException, CosServiceException;

请求示例

// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
// 详细代码参见本页:前期准备 -> 创建 COSClient
COSClient cosClient = createCOSClient();

// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
// 源对象与目标对象的对象键
String sourceKey = "my-space/a.txt";
String destinationKey = "my-space/b.txt";

MoveObjectRequest moveObjectRequest = new MoveObjectRequest(bucketName, sourceKey, destinationKey);
// 目标已存在时抛出异常
moveObjectRequest.setConflictResolutionStrategy(ConflictResolutionStrategy.ASK);

try {
MoveObjectResult moveObjectResult = cosClient.moveObject(moveObjectRequest);
String etag = moveObjectResult.getETag();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 确认本进程不再使用 cosClient 实例之后,关闭即可
cosClient.shutdown();

参数说明

参数名称
描述
类型
moveObjectRequest
移动对象请求
MoveObjectRequest
Request 成员说明:
参数名称
描述
类型
bucketName
Bucket 的命名格式为 BucketName-APPID ,详情请参见 命名规范
String
sourceKey
源对象的对象键,对象键(Key)是对象在存储桶中的唯一标识,详情请参见 对象键
String
destinationKey
目标对象的对象键
String
conflictResolutionStrategy
冲突解决策略,可选值为 ASK、RENAME、OVERWRITE,详情请参见本文 冲突解决策略
ConflictResolutionStrategy

返回结果说明

成功:返回 MoveObjectResult,包含目标对象的 ETag、最后修改时间等信息。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。
MoveObjectResult 成员说明:
参数名称
描述
类型
eTag
目标对象的 ETag
String
lastModified
目标对象的最后修改时间
Date
crc64Ecma
目标对象的 CRC64 值
String

递归移动对象

将目录及其下的所有子文件和子目录移动到目标位置(Move Object Recursive)。

方法原型

public MoveObjectResult moveObjectRecursive(MoveObjectRequest moveObjectRequest)
throws CosClientException, CosServiceException;

请求示例

// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
// 详细代码参见本页:前期准备 -> 创建 COSClient
COSClient cosClient = createCOSClient();

// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
// 源目录与目标目录的对象键
String sourceKey = "my-space/bbb";
String destinationKey = "my-space/ccc";

MoveObjectRequest moveObjectRequest = new MoveObjectRequest(bucketName, sourceKey, destinationKey);
// 目标已存在时抛出异常
moveObjectRequest.setConflictResolutionStrategy(ConflictResolutionStrategy.ASK);

try {
MoveObjectResult moveObjectResult = cosClient.moveObjectRecursive(moveObjectRequest);
String etag = moveObjectResult.getETag();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 确认本进程不再使用 cosClient 实例之后,关闭即可
cosClient.shutdown();

参数说明

参数名称
描述
类型
moveObjectRequest
递归移动请求
MoveObjectRequest
Request 成员说明:
参数名称
描述
类型
bucketName
Bucket 的命名格式为 BucketName-APPID ,详情请参见 命名规范
String
sourceKey
源目录的对象键,例如 my-space/bbb
String
destinationKey
目标目录的对象键,例如 my-space/ccc
String
conflictResolutionStrategy
冲突解决策略,可选值为 ASK、RENAME,详情请参见本文 冲突解决策略
ConflictResolutionStrategy

返回结果说明

成功:返回 MoveObjectResult,成员说明同 移动对象。
失败:发生错误(如身份认证失败),抛出异常 CosClientException 或者 CosServiceException。详情请参见 异常处理。

API 操作

关于递归复制对象的 API 接口说明,请参见 Copy Object Recursive 文档。
关于移动对象的 API 接口说明,请参见 Move Object 文档。
关于递归移动对象的 API 接口说明,请参见 Move Object Recursive 文档。