Object

上传Object

最简单的上传

  • 基本流程

    1. 创建BOSClient类的实例。
    2. 调用BOSClient putObject方法,可以通过如下二种方式上传Object:文件、二进制数据的形式。
    3. 对返回的BOSPutObjectResponse类型实例,可以执行获取eTag操作。
  • 示例代码

    BOSObjectContent* content = [[BOSObjectContent alloc] init];
    // 以文件方式
    content.objectData.file = @"<file path>";
    
    // 或者以二进制数据方式
    NSData* data = [[NSData alloc] init];
    content.objectData.data = data;
    
    BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init];
    request.bucket = @"<bucketname>";
    request.key = @"<objectname>";
    request.objectContent = content;
    
    __block BOSPutObjectResponse* response = nil;
    BCETask* task = [client putObject:request];
    task.then(^(BCEOutput* output) {
      if (output.progress) {
          NSLog(@"put object progress is %@", output.progress);
      }
    
      if (output.response) {
          response = (BOSPutObjectResponse*)output.response;
          NSLog(@"put object success!");
      }
    
      if (output.error) {
          NSLog(@"put object failure");
      }
    });
    [task waitUtilFinished];
    

    说明:Object以文件的形式上传到BOS中,putObject函数支持不超过5GB的Object上传。在putObject请求处理成功后,BOS会在Header中返回Object的ETag作为文件标识。

  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    BOSObjectContent* content = [[BOSObjectContent alloc] init];
    // 以文件方式
    content.objectData.file = @"<file path>";
    
    // 或者以二进制数据方式
    NSData* data = [[NSData alloc] init];
    content.objectData.data = data;
    
    BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init];
    request.bucket = @"<bucketname>";
    request.key = @"<objectname>";
    request.objectContent = content;
    
    __block BOSPutObjectResponse* response = nil;
    BCETask* task = [client putObject:request];
    task.then(^(BCEOutput* output) {
        if (output.progress) {
            NSLog(@"put object progress is %@", output.progress);
        }
    
        if (output.response) {
            response = (BOSPutObjectResponse*)output.response;
            NSLog(@"put object success!");
        }
    
        if (output.error) {
            NSLog(@"put object failure");
        }
    });
    [task waitUtilFinished];
    }
    

设定Object的Http Header

BOS支持您在上传object时设定Http Header。

  • 基本流程

    1. 创建BOSObjectMetadata类的实例。
    2. 设定BOSObjectMetadata实例的contentEncoding/contentType/contentDisposition等字段。
    3. 将BOSObjectMetadata实例设置到BOSPutObjectRequest的objectContent.metadata字段上。
  • 示例代码

    BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init];
    metadata.contentEncoding = @"<encoding>";
    metadata.contentDisposition = @"<content disposition>";
    content.metadata = metadata;
    
  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    BOSObjectContent* content = [[BOSObjectContent alloc] init];
    // 以文件方式
    content.objectData.file = @"<file path>";
    
    // 或者以二进制数据方式
    NSData* data = [[NSData alloc] init];
    content.objectData.data = data;
    
    BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init];
    metadata.contentEncoding = @"<encoding>";
    metadata.contentDisposition = @"<content disposition>";
    content.metadata = metadata;
    
    BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init];
    request.bucket = @"<bucketname>";
    request.key = @"<Objectname>";
    request.objectContent = content;
    
    __block BOSPutObjectResponse* response = nil;
    BCETask* task = [client putObject:request];
    task.then(^(BCEOutput* output) {
        if (output.progress) {
            NSLog(@"put object progress is %@", output.progress);
        }
    
        if (output.response) {
            response = (BOSPutObjectResponse*)output.response;
            NSLog(@"put object success!");
        }
    
        if (output.error) {
            NSLog(@"put object failure");
        }
    });
    [task waitUtilFinished];
    }
    

用户自定义元数据

BOS支持用户自定义元数据来对Object进行描述。

  • 基本流程

    1. 创建BOSObjectMetadata类的实例。
    2. 将自定义元数据字典设置到BOSObjectMetadata的userMetadata字段。
  • 示例代码

    BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init];
    metadata.contentEncoding = @"<encoding>";
    metadata.contentDisposition = @"<content disposition>";
    content.metadata = metadata;
    
    NSDictionary* customMetadata = @{
      @"name" : @"my-data"
    };
    content.metadata.userMetadata = customMetadata;
    

    说明:在上面代码中,用户自定义了一个名字为”name”,值为”my-data”的元数据。当用户下载此Object的时候,此元数据也可以一并得到。一个Object可以有多个类似的参数,但所有的User Meta总大小不能超过2KB。

  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    BOSObjectContent* content = [[BOSObjectContent alloc] init];
    // 以文件方式
    content.objectData.file = @"<file path>";
    
    // 或者以二进制数据方式
    NSData* data = [[NSData alloc] init];
    content.objectData.data = data;
    
    BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init];
    metadata.contentEncoding = @"<encoding>";
    metadata.contentDisposition = @"<content disposition>";
    content.metadata = metadata;
    
    NSDictionary* customMetadata = @{
        @"name" : @"my-data"
    };
    content.metadata.userMetadata = customMetadata;
    
    BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init];
    request.bucket = @"<bucketname>";
    request.key = @"<objectname>";
    request.objectContent = content;
    
    __block BOSPutObjectResponse* response = nil;
    BCETask* task = [client putObject:request];
    task.then(^(BCEOutput* output) {
        if (output.progress) {
            NSLog(@"put object progress is %@", output.progress);
        }
    
        if (output.response) {
            response = (BOSPutObjectResponse*)output.response;
            NSLog(@"put object success!");
        }
    
        if (output.error) {
            NSLog(@"put object failure");
        }
    });
    [task waitUtilFinished];
    }
    

查看Bucket中的Object

简单查询

查看Bucket中Object列表。

  • 基本流程

    1. 创建BOSClient类的实例。
    2. 执行BOSClient listObjects方法,会返回BOSListObjectsResponse类的实例。
    3. 可以对BOSListObjectsResponse类型的contents字段进行枚举,获取key/lastModified/eTag/size/owner。
  • 示例代码

    BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
    listObjRequest.bucket = @"<bucketname>";
    
    __block BOSListObjectsResponse* listObjResponse = nil;
    BCETask* task = [client listObjects:listObjRequest];
    task.then(^(BCEOutput* output) {
      if (output.response) {
          listObjResponse = (BOSListObjectsResponse*)output.response;
    
          for (BOSObjectInfo* object in listObjResponse.contents) {
              NSLog(@"the object key is %@", object.key);
              NSLog(@"the object lastModified is %@", object.lastModified);
              NSLog(@"the object eTag is %@", object.eTag);
              NSLog(@"the object size is %llu", object.size);
              NSLog(@"the object owner id is %@", object.owner.ownerID);
          }
      }
    
      if (output.error) {
          NSLog(@"list objects failure");
      }
    });
    [task waitUtilFinished];
    

    说明: listObjects方法返回BOSListObjectsResponse对象,BOSListObjectsResponse对象包含了此次listObject请求的返回结果。用户可以通过BOSListObjectsResponse中的contents属性获取所有Object的描述信息。

    • 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中isTruncated值为YES,并返回nextMarker做为下次读取的起点。
    • 若想获取更多的Object,可以使用marker参数分次读取,请参考扩展查询
  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
    listObjRequest.bucket = @"<bucketname>";
    
    __block BOSListObjectsResponse* listObjResponse = nil;
    BCETask* task = [client listObjects:listObjRequest];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            listObjResponse = (BOSListObjectsResponse*)output.response;
    
            for (BOSObjectInfo* object in listObjResponse.contents) {
                NSLog(@"the object key is %@", object.key);
                NSLog(@"the object lastModified is %@", object.lastModified);
                NSLog(@"the object eTag is %@", object.eTag);
                NSLog(@"the object size is %llu", object.size);
                NSLog(@"the object owner id is %@", object.owner.ownerID);
            }
        }
    
        if (output.error) {
            NSLog(@"list objects failure");
        }
    });
    [task waitUtilFinished];
    }
    

扩展查询

用户可以通过设置BOSListObjectsResquest参数来完成更多扩展查询操作设置。BOSListObjectsResquest中可以设置的扩展参数如下:

参数名称 说明 默认值
maxKeys 设定此次返回Object的最大个数,不可超过1000。 1000
prefix 设定objectKey的前缀,前缀是指objectKey包含并以prefix的值作为开始。通常与delimiter配合在查询模拟文件夹中使用。 -
delimiter 是一个分隔符,用来对objectKey进行分层。通常与prefix配合在查询模拟文件夹中使用。从prefix开始到第一次出现delimiter字符之间的objectKey称为:commonPrefixes。 -
marker 是一个字符串,用来设定返回结果的起始位置。设定marker值之后,返回的Object会从marker值之后按字母排序开始返回。 -
  • 基本流程

    1. 创建BOSListObjectsResquest类的实例。
    2. 设置BOSListObjectsResquest的delimiter/marker/prefix/maxKeys等字段,实现更多的扩展查询操作。
    3. 创建BOSClient类的实例,执行listObjects。
  • 示例代码

    BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
    listObjRequest.bucket = @"<bucketname>";
    listObjRequest.marker = @"<marker>";
    
    __block BOSListObjectsResponse* listObjResponse = nil;
    BCETask* task = [client listObjects:listObjRequest];
    task.then(^(BCEOutput* output) {
      if (output.response) {
          listObjResponse = (BOSListObjectsResponse*)output.response;
    
          for (BOSObjectInfo* object in listObjResponse.contents) {
              NSLog(@"the object key is %@", object.key);
              NSLog(@"the object lastModified is %@", object.lastModified);
              NSLog(@"the object eTag is %@", object.eTag);
              NSLog(@"the object size is %llu", object.size);
              NSLog(@"the object owner id is %@", object.owner.ownerID);
          }
      }
    
      if (output.error) {
          NSLog(@"list objects failure");
      }
    });
    [task waitUtilFinished];
    
  • 完整示例

    示例一:

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
    listObjRequest.bucket = @"<bucketname>";
    listObjRequest.marker = @"<marker>";
    
    __block BOSListObjectsResponse* listObjResponse = nil;
    BCETask* task = [client listObjects:listObjRequest];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            listObjResponse = (BOSListObjectsResponse*)output.response;
    
            for (BOSObjectInfo* object in listObjResponse.contents) {
                NSLog(@"the object key is %@", object.key);
                NSLog(@"the object lastModified is %@", object.lastModified);
                NSLog(@"the object eTag is %@", object.eTag);
                NSLog(@"the object size is %llu", object.size);
                NSLog(@"the object owner id is %@", object.owner.ownerID);
            }
        }
    
        if (output.error) {
            NSLog(@"list objects failure");
        }
    });
    [task waitUtilFinished];
    }
    

    示例二:使用nextMarker的完整示例。

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
    listObjRequest.bucket = @"<bucketname>";
    listObjRequest.marker = @"<marker>";
    
    __block BOSListObjectsResponse* listObjResponse = nil;
    BCETask* task = [client listObjects:listObjRequest];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            listObjResponse = (BOSListObjectsResponse*)output.response;
        }
    
        if (output.error) {
            NSLog(@"list objects failure");
        }
    });
    [task waitUtilFinished];
    
    if (listObjResponse != nil) {
        listObjRequest.marker = listObjResponse.nextMarker;
        task = [client listObjects:listObjRequest];
        task.then(^(BCEOutput* output) {
            if (output.response) {
                listObjResponse = (BOSListObjectsResponse*)output.response;
    
                for (BOSObjectInfo* object in listObjResponse.contents) {
                    NSLog(@"the object key is %@", object.key);
                    NSLog(@"the object lastModified is %@", object.lastModified);
                    NSLog(@"the object eTag is %@", object.eTag);
                    NSLog(@"the object size is %llu", object.size);
                    NSLog(@"the object owner id is %@", object.owner.ownerID);
                }
            }
        });
    }
    }
    

查询模拟文件夹

由于BOS本身是一个(<Key>,<Value>)的存储系统,所以原则上并不会存在“文件夹”的概念,但您可以通过delimiterprefix参数的配合进行文件夹功能模拟。

假设Bucket中有5个文件:bos.jpg,fun/,fun/test.jpg,fun/movie/001.avi,fun/movie/007.avi,可以把 “/” 符号作为分隔符模拟文件夹。

递归列出模拟文件夹下所有文件

可以通过设置prefix参数来获取某个模拟文件夹下所有的文件:

BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
listObjRequest.bucket = @"<bucketname>";
 listObjRequest.prefix = @"fun/";

__block BOSListObjectsResponse* listObjResponse = nil;
BCETask* task = [client listObjects:listObjRequest];
task.then(^(BCEOutput* output) {
    if (output.response) {
        listObjResponse = (BOSListObjectsResponse*)output.response;

        for (BOSObjectInfo* object in listObjResponse.contents) {
            NSLog(@"%@", object.key);
        }
    }
});
[task waitUtilFinished];

输出:

Objects:
fun/
fun/movie/001.avi
fun/movie/007.avi
fun/test.jpg

查看模拟文件夹下的文件和子文件夹

prefixdelimiter结合的情况下,可以列出模拟文件夹下的文件和子文件夹:

BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
listObjRequest.bucket = @"<bucketname>";

// 指定"/"为模拟文件夹的分隔符
listObjRequest.delimiter = @"/";

// 列出fun文件夹下的所有文件和子文件夹
listObjRequest.prefix = @"fun/";

__block BOSListObjectsResponse* listObjResponse = nil;
BCETask* task = [client listObjects:listObjRequest];
task.then(^(BCEOutput* output) {
    if (output.response) {
        listObjResponse = (BOSListObjectsResponse*)output.response;
    }

    if (output.error) {
        NSLog(@"list objects failure");
    }
});
[task waitUtilFinished];

// 遍历所有Object
NSLog(@"Objects:");
for (BOSObjectInfo* object in listObjResponse.contents) {
    NSLog(@"%@", object.key);
}

// 遍历所有CommonPrefix
NSLog(@"CommonPrefixs:");
for (NSString* commonPrefix in listObjResponse.commonPrefixes) {
    NSLog(@"%@", commonPrefix);
}

输出:

Objects:
fun/
fun/test.jpg

CommonPrefixs:
fun/movie/

说明: 返回的结果中,contents的列表中给出的是fun文件夹下的文件。而commonPrefixs的列表中给出的是fun文件夹下的所有子文件夹。可以看出fun/movie/001.avifun/movie/007.avi两个文件并没有被列出来,因为它们属于fun文件夹下的movie子文件夹下的文件。

获取Object

简单的获取Object

用户可以通过如下代码将Object读取到内存中。

  • 基本流程

    1. 创建BOSClient类的实例。
    2. 执行BOSClient getObject方法,会返回BOSGetObjectResponse实例。
    3. 访问BOSGetObjectResponse示例的objectContent.objectData.data属性,获取数据。
  • 示例代码

    __block BOSGetObjectResponse* getObjResponse = nil;
    BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init];
    getObjRequest.bucket = @"<bucketname>";
    getObjRequest.key = @"<objectname>";
    BCETask* task = [client getObject:getObjRequest];
    task.then(^(BCEOutput* output) {
      if (output.response) {
          getObjResponse = (BOSGetObjectResponse*)output.response;
          NSLog(@"get object success!");
      }
    
      if (output.error) {
          NSLog(@"get object failure with %@", outpu****t.error);
      }
    
      if (output.progress) {
          NSLog(@"the get object progress is %@", output.progress);
      }
    });
    [task waitUtilFinished];
    
    // 获取内存中的数据
    NSData* data = getObjResponse.objectContent.objectData.data;
    

    注意:

    • BOSObjectContent中包含了Object的各种信息,包含Object所在的Bucket、Object的名称、MetaData以及数据存储。
    • BOSObjectMetadata中包含了Object上传时定义的ETag,Http Header以及自定义的元数据。
    • 通过BOSObjectContent的objectData属性,获取到Object的数据。
  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
    // 初始化
    BCECredentials* credentials = [[BCECredentials alloc] init];
    credentials.accessKey = @"<access key>";
    credentials.secretKey = @"<secret key>";
    BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
    configuration.credentials = credentials;
    
    BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
    __block BOSGetObjectResponse* getObjResponse = nil;
    BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init];
    getObjRequest.bucket = @"<bucketname>";
    getObjRequest.key = @"<objectname>";
    BCETask* task = [client getObject:getObjRequest];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            getObjResponse = (BOSGetObjectResponse*)output.response;
            NSLog(@"get object success!");
        }
    
        if (output.error) {
            NSLog(@"get object failure with %@", output.error);
        }
    
        if (output.progress) {
            NSLog(@"the get object progress is %@", output.progress);
        }
    });
    [task waitUtilFinished];
    
    NSData* data = getObjResponse.objectContent.objectData.data;
    }
    

下载Object的一部分内容

  • 基本流程

    1. 创建BOSGetObjectRequest类的实例。
    2. BOSGetObjectRequestt实例的rangeStart和/或rangeEnd字段。
    3. 执行client getObject操作。
  • 示例代码

    __block BOSGetObjectResponse* getObjResponse = nil;
    BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init];
    getObjRequest.bucket = @"<bucketname>";
    getObjRequest.key = @"<objectname>";
    
    // 获取前100个字节
    getObjRequest.rangeStart = @"0";
    getObjRequest.rangeStart = @"99";
    
    BCETask* task = [client getObject:getObjRequest];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            getObjResponse = (BOSGetObjectResponse*)output.response;
            NSLog(@"get object success!");
        }
    
        if (output.error) {
            NSLog(@"get object failure with %@", output.error);
        }
    
        if (output.progress) {
            NSLog(@"the get object progress is %@", output.progress);
        }
    });
    [task waitUtilFinished];
    
    NSData* data = getObjResponse.objectContent.objectData.data;
    

    说明:用户可以用此功能实现文件的分段下载和断点续传。

下载Object到指定路径

用户可以通过如下代码直接将Object下载到指定路径。

  • 基本流程

    1. 创建BOSGetObjectRequest类的实例。
    2. 设置要保存的文件名到BOSGetObjectRequest实例的file字段。
    3. 执行client getObject操作。
    4. Object可以直接下载到指定路径。
  • 示例代码

    __block BOSGetObjectResponse* getObjResponse = nil;
    BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init];
    getObjRequest.bucket = @"<bucketname>";
    getObjRequest.key = @"<objectname>";
    
    // 设置保存到的文件路径
    getObjRequest.file = @"<file>";
    
    BCETask* task = [client getObject:getObjRequest];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            getObjResponse = (BOSGetObjectResponse*)output.response;
            NSLog(@"get object success!");
        }
    
        if (output.error) {
            NSLog(@"get object failure with %@", output.error);
        }
    
        if (output.progress) {
            NSLog(@"the get object progress is %@", output.progress);
        }
    });
    [task waitUtilFinished];
    

获取Object的storageClass

Object的storage class属性分为STANDARD(标准存储), STANDARD_IA(低频存储)和COLD(冷存储)。

示例代码

__block BOSGetObjectMetadataResponse* getObjMetaResponse = nil;
BCETask* task = [client getObjectMetadata:@"<bucketname>" objectKey:@"<objectname>"];
task.then(^(BCEOutput* output) {
    if (output.response) {
        getObjMetaResponse = (BOSGetObjectMetadataResponse*)output.response;
        NSString storageClass = getObjMetaResponse.storageClass;
        NSLog(@"get object storageClass success!");
    }

    if (output.error) {
        NSLog(@"get object storageClass failure");
    }
});
[task waitUtilFinished];

只获取ObjectMetadata

通过getObjectMetadata 方法可以只获取 Object metadata 而不获取Object的实体。

  • 示例代码

    __block BOSGetObjectMetadataResponse* getObjMetaResponse = nil;
    BCETask* task = [client getObjectMetadata:@"<bucketname>" objectKey:@"<objectname>"];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            getObjMetaResponse = (BOSGetObjectMetadataResponse*)output.response;
            NSLog(@"get object metadata success!");
        }
    
        if (output.error) {
            NSLog(@"get object metadata failure");
        }
    });
    [task waitUtilFinished];
    

获取Object的URL

您可以通过如下代码获取指定Object的URL,该功能通常用于您将Object的URL临时分享给其他用户的场景。

  • 基本流程

    1. 创建BOSClient类的实例。
    2. 执行BOSClient generatePresignedUrl方法。
    3. 返回一个Object的URL。
  • 示例代码

    __block BOSGeneratePresignedUrlResponse *generateObjetUrlRes = nil;
    BCEOutput* output = [client generatePresignedUrl:@"<bucketname>" objectKey:@"<objectname>" expirationInSeconds:<ExpirationInSeconds>];
    if (output.response) {
        generateObjetUrlRes = (BOSGeneratePresignedUrlResponse*)output.response;
        NSLog(@"get url success, the usrlstting is : %@", [generateObjetUrlRes.objectUrl absoluteString]);
    }
    
    if (output.error) {
        NSLog(@"get url failure, error : %@:", output.error);
    }
    

    说明:ExpirationInSeconds为指定的URL有效时长,时间从当前时间算起,为可选参数,不配置时系统默认值为1800秒。如果要设置为永久不失效的时间,可以将ExpirationInSeconds参数设置为 -1,不可设置为其他负数。

  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
      // 初始化
      BCECredentials* credentials = [[BCECredentials alloc] init];
      credentials.accessKey = @"<access key>";
      credentials.secretKey = @"<secret key>";
      BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
      configuration.credentials = credentials;
    
      BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
      __block BOSGeneratePresignedUrlResponse *generateObjetUrlRes = nil;
         BCEOutput* output = [client generatePresignedUrl:@"<bucketname>" objectKey:@"<objectname>" expirationInSeconds:<ExpirationInSeconds>];
      if (output.response) {
        generateObjetUrlRes =     (BOSGeneratePresignedUrlResponse*)output.response;
        NSLog(@"get url success, the usrlstting is : %@", [generateObjetUrlRes.objectUrl absoluteString]);
      }
      if (output.error) {
        NSLog(@"get url failure, error : %@:", output.error);
      }
    }
    

删除Object

  • 基本流程

    1. 创建BOSClient类的实例。
    2. 执行BOSClient deleteObject方法。
    3. 若操作失败后产生错误。
  • 示例代码

    __block BOSDeleteObjectResponse* response = nil;
    BCETask* task = [client deleteObject:@"<bucketname>" objectKey:@"<objectname>"];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            response = (BOSDeleteObjectResponse*)output.response;
            NSLog(@"delete obj success!");
        }
    
        if (output.error) {
            NSLog(@"delete obj failure");
        }
    });
    [task waitUtilFinished];
    
  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
      // 初始化
      BCECredentials* credentials = [[BCECredentials alloc] init];
      credentials.accessKey = @"<access key>";
      credentials.secretKey = @"<secret key>";
      BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
      configuration.credentials = credentials;
    
      BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
      __block BOSDeleteObjectResponse* response = nil;
      BCETask* task = [client deleteObject:@"<bucketname>" objectKey:@"<objectname>"];
      task.then(^(BCEOutput* output) {
          if (output.response) {
              response = (BOSDeleteObjectResponse*)output.response;
              NSLog(@"delete obj success!");
          }
    
          if (output.error) {
              NSLog(@"delete obj failure");
          }
      });
      [task waitUtilFinished];
    }
    

拷贝Object

简单拷贝Object

  • 基本流程

    1. 创建BOSClient类的实例。
    2. 执行BOSClient copyObject方法。
    3. 返回BOSCopyObjectResponse类实例,可通过eTag/lastModified等属性获取eTag和最后修改时间。
  • 示例代码

    BOSCopyObjectRequest* request = [[BOSCopyObjectRequest alloc] init];
    request.bucket = @"<bucketname>";
    request.key = @"<objectname>";
    request.source = @"<sourceBucket>/<sourceObject";
    
    __block BOSCopyObjectResponse* response = nil;
    BCETask* task = [client copyObject:request];
    task.then(^(BCEOutput* output) {
        if (output.response) {
            response = (BOSCopyObjectResponse*)output.response;
            NSLog(@"copy obj success!");
        }
    
        if (output.error) {
            NSLog(@"copy obj failure");
        }
    });
    [task waitUtilFinished];
    
  • 完整示例

    #import <BaiduBCEBasic/BaiduBCEBasic.h>
    #import <BaiduBCEBOS/BaiduBCEBOS.h>
    
    void example(void) {
      // 初始化
      BCECredentials* credentials = [[BCECredentials alloc] init];
      credentials.accessKey = @"<access key>";
      credentials.secretKey = @"<secret key>";
      BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init];
      configuration.credentials = credentials;
    
      BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration];
    
      BOSCopyObjectRequest* request = [[BOSCopyObjectRequest alloc] init];
      request.bucket = @"<bucketname>";
      request.key = @"<objectname>";
      request.source = @"<sourceBucket>/<sourceObject";
    
      __block BOSCopyObjectResponse* response = nil;
      BCETask* task = [client copyObject:request];
      task.then(^(BCEOutput* output) {
          if (output.response) {
              response = (BOSCopyObjectResponse*)output.response;
              NSLog(@"copy obj success!");
          }
    
          if (output.error) {
              NSLog(@"copy obj failure");
          }
      });
      [task waitUtilFinished];
    }
    

    说明:copyObject 方法返回一个 BOSCopyObjectResponse 对象,该对象中包含了新Object的ETag和修改时间。

指定条件拷贝Object

您也可以通过指定条件来实现Object的拷贝。该功能一般用于如下场景:

  • Copy一个Object但重新设置meta。
  • 重置某个现有Object的meta(把源和目标设置为同一个Object)。
  • 当源Object的eTag与指定的eTag相同时复制;
  • 当源Object的eTag与指定的eTag不相同时复制;
  • 当源Object的在指定的时间后没有被修改时复制;
  • 当源Object的在指定的时间后被修改过时复制;

具体内容如下:

  • 基本流程

    1. 创建BOSCopyObjectRequest类的实例,传入<source>,<ifMatchEtag>, <ifNotMatchEtag>,<ifModifiedSince>,<ifUnmodifiedSince>, <metadataDirective>参数。
    2. 返回BOSCopyObjectResponse类实例,可通过eTag/lastModified属性获取eTag和最后修改时间。
  • 示例代码

    BOSCopyObjectRequest* request = [[BOSCopyObjectRequest alloc] init];
    request.bucket = @"<bucketname>";
    request.key = @"<objectname>";
    request.source = @"<sourceBucket>/<sourceObject";
    request.metadataDirective = @"replace";
    request.ifModifiedSince = @"Wed, 01 Mar 2006 12:00:00 GMT";
    
    __block BOSCopyObjectResponse* response = nil;
    BCETask* task = [client copyObject:request];
    task.then(^(BCEOutput* output) {
      if (output.response) {
          response = (BOSCopyObjectResponse*)output.response;
          NSLog(@"copy obj success!");
      }
    
      if (output.error) {
          NSLog(@"copy obj failure");
      }
    });
    [task waitUtilFinished];
    

    说明:BOSCopyObjectRequest 允许用户修改目的Object的ObjectMeta,同时也提供 MatchingETagConstraints 参数的设定。