移动对象

最后更新时间:2021-05-27 16:04:53

    简介

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

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

    移动对象

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

    由于 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 存储桶,然后删除原来的对象。

    示例代码

    Objective-C

    QCloudCOSXMLCopyObjectRequest* request = [[QCloudCOSXMLCopyObjectRequest alloc] init];
    
    // 存储桶名称,格式为 BucketName-APPID
    request.bucket = @"examplebucket-1250000000";
    
    // 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
    request.object = @"exampleobject";
    
    // 文件来源存储桶,需要是公有读或者在当前账号有权限
    request.sourceBucket = @"sourcebucket-1250000000";
    
    // 源文件名称
    request.sourceObject = @"sourceObject";
    
    // 源文件的 APPID
    request.sourceAPPID = @"1250000000";
    
    // 来源的地域
    request.sourceRegion= @"COS_REGION";
    
    [request setFinishBlock:^(QCloudCopyObjectResult* result, NSError* error) {
       // 可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息
       if(!error){
           QCloudDeleteObjectRequest* deleteObjectRequest = [QCloudDeleteObjectRequest new];
    
           // 文件来源存储桶,需要是公有读或者在当前账号有权限
           deleteObjectRequest.bucket = @"sourcebucket-1250000000";
    
           // 源文件名称,是源对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
           deleteObjectRequest.object = @"sourceObject";
    
           [deleteObjectRequest setFinishBlock:^(id outputObject, NSError *error) {
               // outputObject 包含所有的响应 http 头部
               NSDictionary* info = (NSDictionary *) outputObject;
           }];
    
           [[QCloudCOSXMLService defaultCOSXML] DeleteObject:deleteObjectRequest];
       }
    }];
    
    // 注意如果是跨地域移动,这里使用的 transferManager 所在的 region 必须为目标桶所在的 region
    [[QCloudCOSTransferMangerService defaultCOSTransferManager] CopyObject:request];
    说明:

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

    Swift

    let copyRequest =  QCloudCOSXMLCopyObjectRequest.init();
    
    // 存储桶名称,格式为 BucketName-APPID
    copyRequest.bucket = "examplebucket-1250000000";
    
    // 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
    copyRequest.object = "exampleobject";
    
    // 文件来源存储桶,需要是公有读或者在当前账号有权限
    // 存储桶名称,格式为 BucketName-APPID
    copyRequest.sourceBucket = "sourcebucket-1250000000";
    
    // 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
    copyRequest.sourceObject = "sourceObject";
    
    // 源文件的 APPID
    copyRequest.sourceAPPID = "1250000000";
    
    // 来源的地域
    copyRequest.sourceRegion = "COS_REGION";
    
    copyRequest.setFinish { (copyResult, error) in
       if let copyResult = copyResult {
           // 文件的 etag
           let deleteObject = QCloudDeleteObjectRequest.init();
    
           // 存储桶名称,格式为 BucketName-APPID
           deleteObject.bucket = "sourcebucket-1250000000";
    
           // 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
           deleteObject.object = "sourceObject";
    
           deleteObject.finishBlock = {(result,error)in
               if let result = result {
                       // result 包含响应的 header 信息
               } else {
                     print(error!);
                 }
           }
           QCloudCOSXMLService.defaultCOSXML().deleteObject(deleteObject);
       } else {
           print(error!);
       }
    
    }
    // 注意如果是跨地域移动,这里使用的 transferManager 所在的 region 必须为目标桶所在的 region
    QCloudCOSTransferMangerService.defaultCOSTransferManager().copyObject(copyRequest);
    说明:

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