tencent cloud

文档反馈

复制与移动对象

最后更新时间:2022-01-23 14:39:49

    简介

    本文档提供关于复制、移动对象的 API 概览以及 SDK 示例代码。

    简单操作

    API 操作名 操作描述
    PUT Object - Copy 设置对象复制(修改对象属性) 复制文件到目标路径
    DELETE Object 删除单个对象 在存储桶中删除指定对象

    分块操作

    API 操作名 操作描述
    List Multipart Uploads 查询分块上传/复制 查询正在进行中的分块上传/复制信息
    Initiate Multipart Upload 初始化分块上传/复制 初始化分块上传/复制操作
    Upload Part - Copy 复制分块 将其他对象复制为一个分块
    List Parts 查询已上传/复制块 查询特定分块操作中的已上传/复制的块
    Complete Multipart Upload 完成分块上传/复制 完成整个文件的分块上传/复制
    Abort Multipart Upload 终止分块上传/复制 终止一个分块操作并删除已上传/复制的块

    SDK API 参考

    SDK 所有接口的具体参数与方法说明,请参考 SDK API 参考

    复制对象

    高级接口封装了简单复制、分块复制接口的异步请求,并支持暂停、恢复以及取消复制请求。

    示例代码

    // 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档
    TransferConfig transferConfig = new TransferConfig.Builder().build();
    //初始化 TransferManager
    TransferManager transferManager = new TransferManager(cosXmlService,
           transferConfig);
    String sourceAppid = "1250000000"; //账号 APPID
    String sourceBucket = "sourcebucket-1250000000"; //源对象所在的存储桶
    String sourceRegion = "COS_REGION"; //源对象的存储桶所在的地域
    String sourceCosPath = "sourceObject"; //源对象的对象键
    //构造源对象属性
    CopyObjectRequest.CopySourceStruct copySourceStruct =
           new CopyObjectRequest.CopySourceStruct(
                   sourceAppid, sourceBucket, sourceRegion, sourceCosPath);
    //目标桶
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.tencentcloud.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    //目标对象
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即对象键
    //复制对象
    COSXMLCopyTask cosxmlCopyTask = transferManager.copy(bucket, cosPath,
           copySourceStruct);
    //设置返回结果回调
    cosxmlCopyTask.setCosXmlResultListener(new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           COSXMLCopyTask.COSXMLCopyTaskResult copyResult =
                   (COSXMLCopyTask.COSXMLCopyTaskResult) result;
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest request,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    //设置任务状态回调, 可以查看任务过程
    cosxmlCopyTask.setTransferStateListener(new TransferStateListener() {
       @Override
       public void onStateChanged(TransferState state) {
           // todo notify transfer state
       }
    });
    

    移动对象

    移动对象主要包括两个操作:复制源对象到目标位置,删除源对象。

    由于 COS 通过存储桶名称(Bucket)和对象键(ObjectKey)来标识对象。移动对象也就意味着修改这个对象的标识,COS Java SDK 目前没有提供修改对象唯一标识名的单独接口,但是可以通过组合复制对象加上删除对象的基本操作,来达到修改对象标识的目的,从而实现移动对象。

    例如将 mybucket-1250000000 这个存储桶中的 picture.jpg 这个对象移动到同个存储桶的 doc 路径下。首先可以复制 picture.jpg 对象到存储桶的 doc 路径下,即对象键设定为 doc/picture.jpg,复制完成后删除 picture.jpg 这个对象,来实现“移动”的效果。

    同样的,如果想将 mybucket-1250000000 这个存储桶里的 picture.jpg 这个对象移动到 myanothorbucket-1250000000 这个存储桶里,可以先将对象复制到 myanothorbucket-1250000000 存储桶,然后删除原来的对象。

    示例代码

    final String sourceAppid = "1250000000"; //账号 appid
    final String sourceBucket = "sourcebucket-1250000000"; //"源对象所在的存储桶
    final String sourceRegion = "COS_REGION"; //源对象的存储桶所在的地域
    final String sourceKey = "sourceObject"; //源对象键
    //构造源对象属性
    CopyObjectRequest.CopySourceStruct copySource = new CopyObjectRequest.CopySourceStruct(sourceAppid, sourceBucket,
           sourceRegion, sourceKey);
    String bucket = "examplebucket-1250000000"; //目标存储桶,格式:BucketName-APPID
    String key = "exampleobject"; //目标对象的对象键
    // copy(String bucket, String cosPath, CopyObjectRequest.CopySourceStruct copySourceStruct){
    COSXMLCopyTask copyTask = transferManager.copy(bucket, key, copySource);
    copyTask.setCosXmlResultListener(new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           try {
               // 复制成功后删除文件
               DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(sourceBucket, sourceKey);
               DeleteObjectResult deleteResult = cosXmlService.deleteObject(deleteObjectRequest);
           } catch (CosXmlClientException e) {
               e.printStackTrace();
           } catch (CosXmlServiceException e) {
               e.printStackTrace();
           }
       }
        @Override
       public void onFail(CosXmlRequest request, CosXmlClientException exception, CosXmlServiceException serviceException) {
        }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    复制对象(修改属性)

    复制文件到目标路径(PUT Object-Copy)。

    示例代码一: 复制对象时保留对象属性

    String sourceAppid = "1250000000"; //账号 APPID
    String sourceBucket = "sourcebucket-1250000000"; //源对象所在的存储桶
    String sourceRegion = "COS_REGION"; //源对象的存储桶所在的地域
    String sourceCosPath = "sourceObject"; //源对象键
    // 构造源对象属性
    CopyObjectRequest.CopySourceStruct copySourceStruct =
           new CopyObjectRequest.CopySourceStruct(
           sourceAppid, sourceBucket, sourceRegion, sourceCosPath);
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.tencentcloud.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即对象键
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, cosPath,
           copySourceStruct);
    cosXmlService.copyObjectAsync(copyObjectRequest, new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           CopyObjectResult copyObjectResult = (CopyObjectResult) result;
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest cosXmlRequest,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    示例代码二: 复制对象时替换对象属性

    String sourceAppid = "1250000000"; //账号 APPID
    String sourceBucket = "sourcebucket-1250000000"; //源对象所在的存储桶
    String sourceRegion = "COS_REGION"; //源对象的存储桶所在的地域
    String sourceCosPath = "sourceObject"; //源对象键
    // 构造源对象属性
    CopyObjectRequest.CopySourceStruct copySourceStruct =
           new CopyObjectRequest.CopySourceStruct(
           sourceAppid, sourceBucket, sourceRegion, sourceCosPath);
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.tencentcloud.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即对象键
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, cosPath,
           copySourceStruct);
    copyObjectRequest.setCopyMetaDataDirective(MetaDataDirective.REPLACED);
    copyObjectRequest.setXCOSMeta("x-cos-metadata-oldKey", "newValue");
    cosXmlService.copyObjectAsync(copyObjectRequest, new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           CopyObjectResult copyObjectResult = (CopyObjectResult) result;
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest cosXmlRequest,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    示例代码三: 修改对象元数据

    String appId = "1250000000"; //账号 APPID
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.tencentcloud.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    String region = "COS_REGION"; //源对象的存储桶所在的地域
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即对象键
    // 构造源对象属性
    CopyObjectRequest.CopySourceStruct copySourceStruct =
           new CopyObjectRequest.CopySourceStruct(
           appId, bucket, region, cosPath);
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, cosPath,
           copySourceStruct);
    copyObjectRequest.setCopyMetaDataDirective(MetaDataDirective.REPLACED);
    // 修改元数据为新值
    copyObjectRequest.setXCOSMeta("x-cos-metadata-oldKey", "newValue");
    cosXmlService.copyObjectAsync(copyObjectRequest, new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           CopyObjectResult copyObjectResult = (CopyObjectResult) result;
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest cosXmlRequest,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    示例代码四: 修改对象存储类型

    String appId = "1250000000"; //账号 APPID
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.tencentcloud.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    String region = "COS_REGION"; //源对象的存储桶所在的地域
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即对象键
    // 构造源对象属性
    CopyObjectRequest.CopySourceStruct copySourceStruct =
           new CopyObjectRequest.CopySourceStruct(
           appId, bucket, region, cosPath);
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, cosPath,
           copySourceStruct);
    // 修改为低频存储
    copyObjectRequest.setCosStorageClass(COSStorageClass.STANDARD_IA);
    cosXmlService.copyObjectAsync(copyObjectRequest, new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           CopyObjectResult copyObjectResult = (CopyObjectResult) result;
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest cosXmlRequest,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持