简介
本文介绍对象存储 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/37140String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参见 https://cloud.tencent.com/document/product/436/6224clientConfig.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-sdkString 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/6224clientConfig.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 实例,如果没有则创建// 详细代码参见本页:前期准备 -> 创建 COSClientCOSClient 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 | String | |
sourceKey | 源目录的对象键,例如 my-space/aaa | String |
destinationBucketName | 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 实例,如果没有则创建// 详细代码参见本页:前期准备 -> 创建 COSClientCOSClient 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 成员说明:
返回结果说明
成功:返回 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 实例,如果没有则创建// 详细代码参见本页:前期准备 -> 创建 COSClientCOSClient 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 | 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 文档。