Object管理
上传Object
最简单的上传
-
基本流程
- 创建BOSClient类的实例。
- 调用BOSClient putObject方法,可以通过如下二种方式上传Object:文件、二进制数据的形式。
- 对返回的BOSPutObjectResponse类型实例,可以执行获取eTag操作。
-
示例代码
Swift1BOSObjectContent* content = [[BOSObjectContent alloc] init]; 2// 以文件方式 3content.objectData.file = @"<file path>"; 4 5// 或者以二进制数据方式 6NSData* data = [[NSData alloc] init]; 7content.objectData.data = data; 8 9BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init]; 10request.bucket = @"<bucketname>"; 11request.key = @"<objectname>"; 12request.objectContent = content; 13 14__block BOSPutObjectResponse* response = nil; 15BCETask* task = [client putObject:request]; 16task.then(^(BCEOutput* output) { 17 if (output.progress) { 18 NSLog(@"put object progress is %@", output.progress); 19 } 20 21 if (output.response) { 22 response = (BOSPutObjectResponse*)output.response; 23 NSLog(@"put object success!"); 24 } 25 26 if (output.error) { 27 NSLog(@"put object failure"); 28 } 29}); 30[task waitUtilFinished];
说明:Object以文件的形式上传到BOS中,putObject函数支持不超过5GB的Object上传。在putObject请求处理成功后,BOS会在Header中返回Object的ETag作为文件标识。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSObjectContent* content = [[BOSObjectContent alloc] init]; 15 // 以文件方式 16 content.objectData.file = @"<file path>"; 17 18 // 或者以二进制数据方式 19 NSData* data = [[NSData alloc] init]; 20 content.objectData.data = data; 21 22 BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init]; 23 request.bucket = @"<bucketname>"; 24 request.key = @"<objectname>"; 25 request.objectContent = content; 26 27 __block BOSPutObjectResponse* response = nil; 28 BCETask* task = [client putObject:request]; 29 task.then(^(BCEOutput* output) { 30 if (output.progress) { 31 NSLog(@"put object progress is %@", output.progress); 32 } 33 34 if (output.response) { 35 response = (BOSPutObjectResponse*)output.response; 36 NSLog(@"put object success!"); 37 } 38 39 if (output.error) { 40 NSLog(@"put object failure"); 41 } 42 }); 43 [task waitUtilFinished]; 44}
设定Object的Http Header
BOS支持您在上传object时设定Http Header。
-
基本流程
- 创建BOSObjectMetadata类的实例。
- 设定BOSObjectMetadata实例的contentEncoding/contentType/contentDisposition等字段。
- 将BOSObjectMetadata实例设置到BOSPutObjectRequest的objectContent.metadata字段上。
-
示例代码
Swift1BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init]; 2metadata.contentEncoding = @"<encoding>"; 3metadata.contentDisposition = @"<content disposition>"; 4content.metadata = metadata;
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSObjectContent* content = [[BOSObjectContent alloc] init]; 15 // 以文件方式 16 content.objectData.file = @"<file path>"; 17 18 // 或者以二进制数据方式 19 NSData* data = [[NSData alloc] init]; 20 content.objectData.data = data; 21 22 BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init]; 23 metadata.contentEncoding = @"<encoding>"; 24 metadata.contentDisposition = @"<content disposition>"; 25 content.metadata = metadata; 26 27 BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init]; 28 request.bucket = @"<bucketname>"; 29 request.key = @"<Objectname>"; 30 request.objectContent = content; 31 32 __block BOSPutObjectResponse* response = nil; 33 BCETask* task = [client putObject:request]; 34 task.then(^(BCEOutput* output) { 35 if (output.progress) { 36 NSLog(@"put object progress is %@", output.progress); 37 } 38 39 if (output.response) { 40 response = (BOSPutObjectResponse*)output.response; 41 NSLog(@"put object success!"); 42 } 43 44 if (output.error) { 45 NSLog(@"put object failure"); 46 } 47 }); 48 [task waitUtilFinished]; 49}
用户自定义元数据
BOS支持用户自定义元数据来对Object进行描述。
-
基本流程
- 创建BOSObjectMetadata类的实例。
- 将自定义元数据字典设置到BOSObjectMetadata的userMetadata字段。
-
示例代码
Swift1BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init]; 2metadata.contentEncoding = @"<encoding>"; 3metadata.contentDisposition = @"<content disposition>"; 4content.metadata = metadata; 5 6NSDictionary* customMetadata = @{ 7 @"name" : @"my-data" 8}; 9content.metadata.userMetadata = customMetadata;
说明:在上面代码中,用户自定义了一个名字为”name”,值为”my-data”的元数据。当用户下载此Object的时候,此元数据也可以一并得到。一个Object可以有多个类似的参数,但所有的User Meta总大小不能超过2KB。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSObjectContent* content = [[BOSObjectContent alloc] init]; 15 // 以文件方式 16 content.objectData.file = @"<file path>"; 17 18 // 或者以二进制数据方式 19 NSData* data = [[NSData alloc] init]; 20 content.objectData.data = data; 21 22 BOSObjectMetadata* metadata = [[BOSObjectMetadata alloc] init]; 23 metadata.contentEncoding = @"<encoding>"; 24 metadata.contentDisposition = @"<content disposition>"; 25 content.metadata = metadata; 26 27 NSDictionary* customMetadata = @{ 28 @"name" : @"my-data" 29 }; 30 content.metadata.userMetadata = customMetadata; 31 32 BOSPutObjectRequest* request = [[BOSPutObjectRequest alloc] init]; 33 request.bucket = @"<bucketname>"; 34 request.key = @"<objectname>"; 35 request.objectContent = content; 36 37 __block BOSPutObjectResponse* response = nil; 38 BCETask* task = [client putObject:request]; 39 task.then(^(BCEOutput* output) { 40 if (output.progress) { 41 NSLog(@"put object progress is %@", output.progress); 42 } 43 44 if (output.response) { 45 response = (BOSPutObjectResponse*)output.response; 46 NSLog(@"put object success!"); 47 } 48 49 if (output.error) { 50 NSLog(@"put object failure"); 51 } 52 }); 53 [task waitUtilFinished]; 54}
查看Bucket中的Object
简单查询
查看Bucket中Object列表。
-
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient listObjects方法,会返回BOSListObjectsResponse类的实例。
- 可以对BOSListObjectsResponse类型的contents字段进行枚举,获取key/lastModified/eTag/size/owner。
-
示例代码
Swift1BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init]; 2listObjRequest.bucket = @"<bucketname>"; 3 4__block BOSListObjectsResponse* listObjResponse = nil; 5BCETask* task = [client listObjects:listObjRequest]; 6task.then(^(BCEOutput* output) { 7 if (output.response) { 8 listObjResponse = (BOSListObjectsResponse*)output.response; 9 10 for (BOSObjectInfo* object in listObjResponse.contents) { 11 NSLog(@"the object key is %@", object.key); 12 NSLog(@"the object lastModified is %@", object.lastModified); 13 NSLog(@"the object eTag is %@", object.eTag); 14 NSLog(@"the object size is %llu", object.size); 15 NSLog(@"the object owner id is %@", object.owner.ownerID); 16 } 17 } 18 19 if (output.error) { 20 NSLog(@"list objects failure"); 21 } 22}); 23[task waitUtilFinished];
说明: listObjects方法返回BOSListObjectsResponse对象,BOSListObjectsResponse对象包含了此次listObject请求的返回结果。用户可以通过BOSListObjectsResponse中的contents属性获取所有Object的描述信息。
- 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中isTruncated值为YES,并返回nextMarker做为下次读取的起点。
- 若想获取更多的Object,可以使用marker参数分次读取,请参考扩展查询。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init]; 15 listObjRequest.bucket = @"<bucketname>"; 16 17 __block BOSListObjectsResponse* listObjResponse = nil; 18 BCETask* task = [client listObjects:listObjRequest]; 19 task.then(^(BCEOutput* output) { 20 if (output.response) { 21 listObjResponse = (BOSListObjectsResponse*)output.response; 22 23 for (BOSObjectInfo* object in listObjResponse.contents) { 24 NSLog(@"the object key is %@", object.key); 25 NSLog(@"the object lastModified is %@", object.lastModified); 26 NSLog(@"the object eTag is %@", object.eTag); 27 NSLog(@"the object size is %llu", object.size); 28 NSLog(@"the object owner id is %@", object.owner.ownerID); 29 } 30 } 31 32 if (output.error) { 33 NSLog(@"list objects failure"); 34 } 35 }); 36 [task waitUtilFinished]; 37}
扩展查询
用户可以通过设置BOSListObjectsResquest参数来完成更多扩展查询操作设置。BOSListObjectsResquest中可以设置的扩展参数如下:
参数名称 | 说明 | 默认值 |
---|---|---|
maxKeys | 设定此次返回Object的最大个数,不可超过1000。 | 1000 |
prefix | 设定objectKey的前缀,前缀是指objectKey包含并以prefix的值作为开始。通常与delimiter配合在查询模拟文件夹中使用。 | - |
delimiter | 是一个分隔符,用来对objectKey进行分层。通常与prefix配合在查询模拟文件夹中使用。从prefix开始到第一次出现delimiter字符之间的objectKey称为:commonPrefixes。 | - |
marker | 是一个字符串,用来设定返回结果的起始位置。设定marker值之后,返回的Object会从marker值之后按字母排序开始返回。 | - |
-
基本流程
- 创建BOSListObjectsResquest类的实例。
- 设置BOSListObjectsResquest的delimiter/marker/prefix/maxKeys等字段,实现更多的扩展查询操作。
- 创建BOSClient类的实例,执行listObjects。
-
示例代码
Swift1BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init]; 2listObjRequest.bucket = @"<bucketname>"; 3listObjRequest.marker = @"<marker>"; 4 5__block BOSListObjectsResponse* listObjResponse = nil; 6BCETask* task = [client listObjects:listObjRequest]; 7task.then(^(BCEOutput* output) { 8 if (output.response) { 9 listObjResponse = (BOSListObjectsResponse*)output.response; 10 11 for (BOSObjectInfo* object in listObjResponse.contents) { 12 NSLog(@"the object key is %@", object.key); 13 NSLog(@"the object lastModified is %@", object.lastModified); 14 NSLog(@"the object eTag is %@", object.eTag); 15 NSLog(@"the object size is %llu", object.size); 16 NSLog(@"the object owner id is %@", object.owner.ownerID); 17 } 18 } 19 20 if (output.error) { 21 NSLog(@"list objects failure"); 22 } 23}); 24[task waitUtilFinished];
-
完整示例
示例一:
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init]; 15 listObjRequest.bucket = @"<bucketname>"; 16 listObjRequest.marker = @"<marker>"; 17 18 __block BOSListObjectsResponse* listObjResponse = nil; 19 BCETask* task = [client listObjects:listObjRequest]; 20 task.then(^(BCEOutput* output) { 21 if (output.response) { 22 listObjResponse = (BOSListObjectsResponse*)output.response; 23 24 for (BOSObjectInfo* object in listObjResponse.contents) { 25 NSLog(@"the object key is %@", object.key); 26 NSLog(@"the object lastModified is %@", object.lastModified); 27 NSLog(@"the object eTag is %@", object.eTag); 28 NSLog(@"the object size is %llu", object.size); 29 NSLog(@"the object owner id is %@", object.owner.ownerID); 30 } 31 } 32 33 if (output.error) { 34 NSLog(@"list objects failure"); 35 } 36 }); 37 [task waitUtilFinished]; 38}
示例二:使用nextMarker的完整示例。
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init]; 15 listObjRequest.bucket = @"<bucketname>"; 16 listObjRequest.marker = @"<marker>"; 17 18 __block BOSListObjectsResponse* listObjResponse = nil; 19 BCETask* task = [client listObjects:listObjRequest]; 20 task.then(^(BCEOutput* output) { 21 if (output.response) { 22 listObjResponse = (BOSListObjectsResponse*)output.response; 23 } 24 25 if (output.error) { 26 NSLog(@"list objects failure"); 27 } 28 }); 29 [task waitUtilFinished]; 30 31 if (listObjResponse != nil) { 32 listObjRequest.marker = listObjResponse.nextMarker; 33 task = [client listObjects:listObjRequest]; 34 task.then(^(BCEOutput* output) { 35 if (output.response) { 36 listObjResponse = (BOSListObjectsResponse*)output.response; 37 38 for (BOSObjectInfo* object in listObjResponse.contents) { 39 NSLog(@"the object key is %@", object.key); 40 NSLog(@"the object lastModified is %@", object.lastModified); 41 NSLog(@"the object eTag is %@", object.eTag); 42 NSLog(@"the object size is %llu", object.size); 43 NSLog(@"the object owner id is %@", object.owner.ownerID); 44 } 45 } 46 }); 47 } 48}
查询模拟文件夹
由于BOS本身是一个(<Key>,<Value>
)的存储系统,所以原则上并不会存在“文件夹”的概念,但您可以通过delimiter
和prefix
参数的配合进行文件夹功能模拟。
假设Bucket中有5个文件:bos.jpg,fun/,fun/test.jpg,fun/movie/001.avi,fun/movie/007.avi,可以把 “/” 符号作为分隔符模拟文件夹。
递归列出模拟文件夹下所有文件
可以通过设置prefix
参数来获取某个模拟文件夹下所有的文件:
1BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
2listObjRequest.bucket = @"<bucketname>";
3 listObjRequest.prefix = @"fun/";
4
5__block BOSListObjectsResponse* listObjResponse = nil;
6BCETask* task = [client listObjects:listObjRequest];
7task.then(^(BCEOutput* output) {
8 if (output.response) {
9 listObjResponse = (BOSListObjectsResponse*)output.response;
10
11 for (BOSObjectInfo* object in listObjResponse.contents) {
12 NSLog(@"%@", object.key);
13 }
14 }
15});
16[task waitUtilFinished];
输出:
1Objects:
2fun/
3fun/movie/001.avi
4fun/movie/007.avi
5fun/test.jpg
查看模拟文件夹下的文件和子文件夹
在prefix
和delimiter
结合的情况下,可以列出模拟文件夹下的文件和子文件夹:
1BOSListObjectsRequest* listObjRequest = [[BOSListObjectsRequest alloc] init];
2listObjRequest.bucket = @"<bucketname>";
3
4// 指定"/"为模拟文件夹的分隔符
5listObjRequest.delimiter = @"/";
6
7// 列出fun文件夹下的所有文件和子文件夹
8listObjRequest.prefix = @"fun/";
9
10__block BOSListObjectsResponse* listObjResponse = nil;
11BCETask* task = [client listObjects:listObjRequest];
12task.then(^(BCEOutput* output) {
13 if (output.response) {
14 listObjResponse = (BOSListObjectsResponse*)output.response;
15 }
16
17 if (output.error) {
18 NSLog(@"list objects failure");
19 }
20});
21[task waitUtilFinished];
22
23// 遍历所有Object
24NSLog(@"Objects:");
25for (BOSObjectInfo* object in listObjResponse.contents) {
26 NSLog(@"%@", object.key);
27}
28
29// 遍历所有CommonPrefix
30NSLog(@"CommonPrefixs:");
31for (NSString* commonPrefix in listObjResponse.commonPrefixes) {
32 NSLog(@"%@", commonPrefix);
33}
输出:
1Objects:
2fun/
3fun/test.jpg
4
5CommonPrefixs:
6fun/movie/
说明: 返回的结果中,
contents
的列表中给出的是fun文件夹下的文件。而commonPrefixs
的列表中给出的是fun文件夹下的所有子文件夹。可以看出fun/movie/001.avi
,fun/movie/007.avi
两个文件并没有被列出来,因为它们属于fun
文件夹下的movie
子文件夹下的文件。
获取Object
简单的获取Object
用户可以通过如下代码将Object读取到内存中。
-
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient getObject方法,会返回BOSGetObjectResponse实例。
- 访问BOSGetObjectResponse示例的objectContent.objectData.data属性,获取数据。
-
示例代码
Swift1__block BOSGetObjectResponse* getObjResponse = nil; 2BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init]; 3getObjRequest.bucket = @"<bucketname>"; 4getObjRequest.key = @"<objectname>"; 5BCETask* task = [client getObject:getObjRequest]; 6task.then(^(BCEOutput* output) { 7 if (output.response) { 8 getObjResponse = (BOSGetObjectResponse*)output.response; 9 NSLog(@"get object success!"); 10 } 11 12 if (output.error) { 13 NSLog(@"get object failure with %@", outpu****t.error); 14 } 15 16 if (output.progress) { 17 NSLog(@"the get object progress is %@", output.progress); 18 } 19}); 20[task waitUtilFinished]; 21 22// 获取内存中的数据 23NSData* data = getObjResponse.objectContent.objectData.data;
注意:
- BOSObjectContent中包含了Object的各种信息,包含Object所在的Bucket、Object的名称、MetaData以及数据存储。
- BOSObjectMetadata中包含了Object上传时定义的ETag,Http Header以及自定义的元数据。
- 通过BOSObjectContent的objectData属性,获取到Object的数据。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 __block BOSGetObjectResponse* getObjResponse = nil; 15 BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init]; 16 getObjRequest.bucket = @"<bucketname>"; 17 getObjRequest.key = @"<objectname>"; 18 BCETask* task = [client getObject:getObjRequest]; 19 task.then(^(BCEOutput* output) { 20 if (output.response) { 21 getObjResponse = (BOSGetObjectResponse*)output.response; 22 NSLog(@"get object success!"); 23 } 24 25 if (output.error) { 26 NSLog(@"get object failure with %@", output.error); 27 } 28 29 if (output.progress) { 30 NSLog(@"the get object progress is %@", output.progress); 31 } 32 }); 33 [task waitUtilFinished]; 34 35 NSData* data = getObjResponse.objectContent.objectData.data; 36}
下载Object的一部分内容
-
基本流程
- 创建BOSGetObjectRequest类的实例。
- BOSGetObjectRequestt实例的rangeStart和/或rangeEnd字段。
- 执行client getObject操作。
-
示例代码
Swift1__block BOSGetObjectResponse* getObjResponse = nil; 2BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init]; 3getObjRequest.bucket = @"<bucketname>"; 4getObjRequest.key = @"<objectname>"; 5 6// 获取前100个字节 7getObjRequest.rangeStart = @"0"; 8getObjRequest.rangeEnd = @"99"; 9 10BCETask* task = [client getObject:getObjRequest]; 11task.then(^(BCEOutput* output) { 12 if (output.response) { 13 getObjResponse = (BOSGetObjectResponse*)output.response; 14 NSLog(@"get object success!"); 15 } 16 17 if (output.error) { 18 NSLog(@"get object failure with %@", output.error); 19 } 20 21 if (output.progress) { 22 NSLog(@"the get object progress is %@", output.progress); 23 } 24}); 25[task waitUtilFinished]; 26 27NSData* data = getObjResponse.objectContent.objectData.data;
说明:用户可以用此功能实现文件的分段下载和断点续传。
下载Object到指定路径
用户可以通过如下代码直接将Object下载到指定路径。
-
基本流程
- 创建BOSGetObjectRequest类的实例。
- 设置要保存的文件名到BOSGetObjectRequest实例的file字段。
- 执行client getObject操作。
- Object可以直接下载到指定路径。
-
示例代码
Swift1__block BOSGetObjectResponse* getObjResponse = nil; 2BOSGetObjectRequest* getObjRequest = [[BOSGetObjectRequest alloc] init]; 3getObjRequest.bucket = @"<bucketname>"; 4getObjRequest.key = @"<objectname>"; 5 6// 设置保存到的文件路径 7getObjRequest.file = @"<file>"; 8 9BCETask* task = [client getObject:getObjRequest]; 10task.then(^(BCEOutput* output) { 11 if (output.response) { 12 getObjResponse = (BOSGetObjectResponse*)output.response; 13 NSLog(@"get object success!"); 14 } 15 16 if (output.error) { 17 NSLog(@"get object failure with %@", output.error); 18 } 19 20 if (output.progress) { 21 NSLog(@"the get object progress is %@", output.progress); 22 } 23}); 24[task waitUtilFinished];
获取Object的storageClass
Object的storage class属性分为STANDARD(标准存储), STANDARD_IA(低频存储)和COLD(冷存储)。
示例代码
1__block BOSGetObjectMetadataResponse* getObjMetaResponse = nil;
2BCETask* task = [client getObjectMetadata:@"<bucketname>" objectKey:@"<objectname>"];
3task.then(^(BCEOutput* output) {
4 if (output.response) {
5 getObjMetaResponse = (BOSGetObjectMetadataResponse*)output.response;
6 NSString storageClass = getObjMetaResponse.storageClass;
7 NSLog(@"get object storageClass success!");
8 }
9
10 if (output.error) {
11 NSLog(@"get object storageClass failure");
12 }
13});
14[task waitUtilFinished];
只获取ObjectMetadata
通过getObjectMetadata 方法可以只获取 Object metadata 而不获取Object的实体。
-
示例代码
Swift1__block BOSGetObjectMetadataResponse* getObjMetaResponse = nil; 2BCETask* task = [client getObjectMetadata:@"<bucketname>" objectKey:@"<objectname>"]; 3task.then(^(BCEOutput* output) { 4 if (output.response) { 5 getObjMetaResponse = (BOSGetObjectMetadataResponse*)output.response; 6 NSLog(@"get object metadata success!"); 7 } 8 9 if (output.error) { 10 NSLog(@"get object metadata failure"); 11 } 12}); 13[task waitUtilFinished];
获取Object的URL
您可以通过如下代码获取指定Object的URL,该功能通常用于您将Object的URL临时分享给其他用户的场景。
-
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient generatePresignedUrl方法。
- 返回一个Object的URL。
-
示例代码
Swift1__block BOSGeneratePresignedUrlResponse *generateObjetUrlRes = nil; 2 BCEOutput_ output = [client generatePresignedUrl:@"<bucketname>" objectKey:@"<objectname>" expirationInSeconds:<ExpirationInSeconds>]; 3 if (output.response) { 4 generateObjetUrlRes = (BOSGeneratePresignedUrlResponse_)output.response; 5 NSLog(@"get url success, the usrlstting is : %@", [generateObjetUrlRes.objectUrl absoluteString]); 6 } 7 if (output.error) { 8 NSLog(@"get url failure, error : %@:", output.error); 9 }
说明: ExpirationInSeconds为指定的URL有效时长,时间从当前时间算起,为可选参数,不配置时系统默认值为1800秒。如果要设置为永久不失效的时间,可以将ExpirationInSeconds参数设置为 -1,不可设置为其他负数。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 __block BOSGeneratePresignedUrlResponse *generateObjetUrlRes = nil; 15 BCEOutput* output = [client generatePresignedUrl:@"<bucketname>" objectKey:@"<objectname>" expirationInSeconds:<ExpirationInSeconds>]; 16 if (output.response) { 17 generateObjetUrlRes = (BOSGeneratePresignedUrlResponse*)output.response; 18 NSLog(@"get url success, the usrlstting is : %@", [generateObjetUrlRes.objectUrl absoluteString]); 19 } 20 if (output.error) { 21 NSLog(@"get url failure, error : %@:", output.error); 22 } 23}
删除Object
-
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient deleteObject方法。
- 若操作失败后产生错误。
-
示例代码
Swift1__block BOSDeleteObjectResponse* response = nil; 2BCETask* task = [client deleteObject:@"<bucketname>" objectKey:@"<objectname>"]; 3task.then(^(BCEOutput* output) { 4 if (output.response) { 5 response = (BOSDeleteObjectResponse*)output.response; 6 NSLog(@"delete obj success!"); 7 } 8 9 if (output.error) { 10 NSLog(@"delete obj failure"); 11 } 12}); 13[task waitUtilFinished];
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 __block BOSDeleteObjectResponse* response = nil; 15 BCETask* task = [client deleteObject:@"<bucketname>" objectKey:@"<objectname>"]; 16 task.then(^(BCEOutput* output) { 17 if (output.response) { 18 response = (BOSDeleteObjectResponse*)output.response; 19 NSLog(@"delete obj success!"); 20 } 21 22 if (output.error) { 23 NSLog(@"delete obj failure"); 24 } 25 }); 26 [task waitUtilFinished]; 27}
拷贝Object
简单拷贝Object
-
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient copyObject方法。
- 返回BOSCopyObjectResponse类实例,可通过eTag/lastModified等属性获取eTag和最后修改时间。
-
示例代码
Swift1BOSCopyObjectRequest* request = [[BOSCopyObjectRequest alloc] init]; 2request.bucket = @"<bucketname>"; 3request.key = @"<objectname>"; 4request.source = @"<sourceBucket>/<sourceObject"; 5 6__block BOSCopyObjectResponse* response = nil; 7BCETask* task = [client copyObject:request]; 8task.then(^(BCEOutput* output) { 9 if (output.response) { 10 response = (BOSCopyObjectResponse*)output.response; 11 NSLog(@"copy obj success!"); 12 } 13 14 if (output.error) { 15 NSLog(@"copy obj failure"); 16 } 17}); 18[task waitUtilFinished];
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSCopyObjectRequest* request = [[BOSCopyObjectRequest alloc] init]; 15 request.bucket = @"<bucketname>"; 16 request.key = @"<objectname>"; 17 request.source = @"<sourceBucket>/<sourceObject"; 18 19 __block BOSCopyObjectResponse* response = nil; 20 BCETask* task = [client copyObject:request]; 21 task.then(^(BCEOutput* output) { 22 if (output.response) { 23 response = (BOSCopyObjectResponse*)output.response; 24 NSLog(@"copy obj success!"); 25 } 26 27 if (output.error) { 28 NSLog(@"copy obj failure"); 29 } 30 }); 31 [task waitUtilFinished]; 32}
说明:copyObject 方法返回一个
BOSCopyObjectResponse
对象,该对象中包含了新Object的ETag和修改时间。
指定条件拷贝Object
您也可以通过指定条件来实现Object的拷贝。该功能一般用于如下场景:
- Copy一个Object但重新设置meta。
- 重置某个现有Object的meta(把源和目标设置为同一个Object)。
- 当源Object的eTag与指定的eTag相同时复制;
- 当源Object的eTag与指定的eTag不相同时复制;
- 当源Object的在指定的时间后没有被修改时复制;
- 当源Object的在指定的时间后被修改过时复制;
具体内容如下:
-
基本流程
- 创建BOSCopyObjectRequest类的实例,传入
<source>
,<ifMatchEtag>
,<ifNotMatchEtag>
,<ifModifiedSince>
,<ifUnmodifiedSince>
,<metadataDirective>
参数。 - 返回BOSCopyObjectResponse类实例,可通过eTag/lastModified属性获取eTag和最后修改时间。
- 创建BOSCopyObjectRequest类的实例,传入
-
示例代码
Swift1BOSCopyObjectRequest* request = [[BOSCopyObjectRequest alloc] init]; 2request.bucket = @"<bucketname>"; 3request.key = @"<objectname>"; 4request.source = @"<sourceBucket>/<sourceObject"; 5request.metadataDirective = @"replace"; 6request.ifModifiedSince = @"Wed, 01 Mar 2006 12:00:00 GMT"; 7 8__block BOSCopyObjectResponse* response = nil; 9BCETask* task = [client copyObject:request]; 10task.then(^(BCEOutput* output) { 11 if (output.response) { 12 response = (BOSCopyObjectResponse*)output.response; 13 NSLog(@"copy obj success!"); 14 } 15 16 if (output.error) { 17 NSLog(@"copy obj failure"); 18 } 19}); 20[task waitUtilFinished];
说明:
BOSCopyObjectRequest
允许用户修改目的Object的ObjectMeta,同时也提供MatchingETagConstraints
参数的设定。
Object的分块上传
除了通过putObject()方法上传文件到BOS以外,BOS还提供了另外一种上传模式:分块上传(Multipart Upload)。用户可以在如下的应用场景内(但不仅限于此),使用分块上传模式,如:
- 需要支持断点上传。
- 上传超过5GB大小的文件。
- 网络条件较差,和BOS的服务器之间的连接经常断开。
- 需要流式地上传文件。
- 上传文件之前,无法确定上传文件的大小。
分块完成Multipart Upload
假设有一个文件,本地路径为/path/to/file.zip
,由于文件比较大,使用分块上传其传输到BOS中。
-
基本流程
- 初始化Multipart Upload。
- 上传分块。
- 完成分块上传。
初始化Multipart Upload
使用initiateMultipartUpload
方法来初始化一个分块上传事件:
-
示例代码
Swift1BOSInitiateMultipartUploadRequest* initMPRequest = [[BOSInitiateMultipartUploadRequest alloc] init]; 2initMPRequest.bucket = @"<bucketname>"; 3initMPRequest.key = @"<objectname>"; 4initMPRequest.contentType = @"<content type>"; 5 6__block BOSInitiateMultipartUploadResponse* initMPResponse = nil; 7BCETask* task = [client initiateMultipartUpload:initMPRequest]; 8task.then(^(BCEOutput* output) { 9 if (output.response) { 10 initMPResponse = (BOSInitiateMultipartUploadResponse*)output.response; 11 NSLog(@"initiate multipart upload success!"); 12 } 13 14 if (output.error) { 15 NSLog(@"initiate multipart upload failure"); 16 } 17}); 18[task waitUtilFinished]; 19 20NSString* uploadID = initMPResponse.uploadId;
说明:
initiateMultipartUpload
的返回结果中含有uploadId
,它是区分分块上传事件的唯一标识,在后面的操作中,我们将用到它。
上传分块
将文件分块上传。
-
示例代码
Swift1// 计算分块个数 2NSString* file = @"/path/to/file.zip"; 3NSDictionary<NSString*, id>* attr = [[NSFileManager defaultManager] attributesOfItemAtPath:file error:nil]; 4uint64_t fileSize = attr.fileSize; 5uint64_t partSize = 1024 * 1024 * 5L; 6uint64_t partCount = fileSize / partSize; 7if (fileSize % partSize != 0) { 8 ++partCount; 9} 10 11NSMutableArray<BOSPart*>* parts = [NSMutableArray array]; 12NSFileHandle* handle = [NSFileHandle fileHandleForReadingAtPath:@"/path/to/file.zip"]; 13for (uint64_t i = 0; i < partCount; ++i) { 14 // seek 15 uint64_t skip = partSize * i; 16 [handle seekToFileOffset:skip]; 17 uint64_t size = (partSize < fileSize - skip) ? partSize : fileSize - skip; 18 19 // data 20 NSData* data = [handle readDataOfLength:size]; 21 22 // request 23 BOSUploadPartRequest* uploadPartRequest = [[BOSUploadPartRequest alloc] init]; 24 uploadPartRequest.bucket = @"<bucketname>"; 25 uploadPartRequest.key = @"<objectname>"; 26 uploadPartRequest.objectData.data = data; 27 uploadPartRequest.partNumber = i + 1; 28 uploadPartRequest.uploadId = uploadID; 29 30 __block BOSUploadPartResponse* uploadPartResponse = nil; 31 task = [client uploadPart:uploadPartRequest]; 32 task.then(^(BCEOutput* output) { 33 if (output.response) { 34 uploadPartResponse = (BOSUploadPartResponse*)output.response; 35 BOSPart* part = [[BOSPart alloc] init]; 36 part.partNumber = i + 1; 37 part.eTag = uploadPartResponse.eTag; 38 [parts addObject:part]; 39 } 40 }); 41 [task waitUtilFinished]; 42}
注意:上面代码的核心是调用
uploadPart
方法来上传每一个分块,但是要注意以下几点:- uploadPart方法要求除最后一个Part以外,其他的Part大小都要大于等于5MB。但是Upload Part接口并不会立即校验上传Part的大小;只有当Complete Multipart Upload的时候才会校验。
- 为了保证数据在网络传输过程中不出现错误,建议您在
uploadPart
后,使用每个分块BOS返回的Content-MD5值分别验证已上传分块数据的正确性。当所有分块数据合成一个Object后,不再含MD5值。 - Part号码的范围是1~10000。如果超出这个范围,BOS将返回InvalidArgument的错误码。
- 每次上传Part时都要把流定位到此次上传块开头所对应的位置。
- 每次上传Part之后,BOS的返回结果会包含一个
BOSPart
对象,它是上传块的ETag与块编号(PartNumber)的组合,在后续完成分块上传的步骤中会用到它,因此需要将其保存起来。一般来讲这些BOSPart
对象将被保存到数组中。
完成分块上传
-
示例代码
Swift1BOSCompleteMultipartUploadRequest* compMultipartRequest = [[BOSCompleteMultipartUploadRequest alloc] init]; 2compMultipartRequest.bucket = @"<bucketname>"; 3compMultipartRequest.key = @"<objectname>"; 4compMultipartRequest.uploadId = uploadID; 5compMultipartRequest.parts = parts; 6 7__block BOSCompleteMultipartUploadResponse* complResponse = nil; 8task = [client completeMultipartUpload:compMultipartRequest]; 9task.then(^(BCEOutput* output) { 10 if (output.response) { 11 complResponse = (BOSCompleteMultipartUploadResponse*)output.response; 12 NSLog(@"complte multiparts success!"); 13 } 14 15 if (output.error) { 16 NSLog(@"complte multiparts failure %@", output.error); 17 } 18}); 19[task waitUtilFinished];
说明:上面代码中的
parts
是第二步中保存的parts的列表,BOS收到用户提交的Part列表后,会逐一验证每个数据Part的有效性。当所有的数据Part验证通过后,BOS将把这些数据part组合成一个完整的Object。 -
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5// 初始化 6BCECredentials* credentials = [[BCECredentials alloc] init]; 7credentials.accessKey = @"<access key>"; 8credentials.secretKey = @"<secret key>"; 9BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10configuration.credentials = credentials; 11 12BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14// 初始化分块上传 15BOSInitiateMultipartUploadRequest* initMPRequest = [[BOSInitiateMultipartUploadRequest alloc] init]; 16initMPRequest.bucket = @"<bucketname>"; 17initMPRequest.key = @"<objectname>"; 18initMPRequest.contentType = @"<content type>"; 19 20 __block BOSInitiateMultipartUploadResponse* initMPResponse = nil; 21 BCETask* task = [client initiateMultipartUpload:initMPRequest]; 22 task.then(^(BCEOutput* output) { 23 if (output.response) { 24 initMPResponse = (BOSInitiateMultipartUploadResponse*)output.response; 25 NSLog(@"initiate multipart upload success!"); 26 } 27 28 if (output.error) { 29 NSLog(@"initiate multipart upload failure"); 30 } 31 }); 32 [task waitUtilFinished]; 33 34 NSString* uploadID = initMPResponse.uploadId; 35 36 // 计算分块个数 37 NSString* file = @"/path/to/file.zip"; 38 NSDictionary<NSString*, id>* attr = [[NSFileManager defaultManager] attributesOfItemAtPath:file error:nil]; 39 uint64_t fileSize = attr.fileSize; 40 uint64_t partSize = 1024 * 1024 * 5L; 41 uint64_t partCount = fileSize / partSize; 42 if (fileSize % partSize != 0) { 43 ++partCount; 44 } 45 46 NSMutableArray<BOSPart*>* parts = [NSMutableArray array]; 47 48 NSFileHandle* handle = [NSFileHandle fileHandleForReadingAtPath:@"/path/to/file.zip"]; 49 for (uint64_t i = 0; i < partCount; ++i) { 50 // seek 51 uint64_t skip = partSize * i; 52 [handle seekToFileOffset:skip]; 53 uint64_t size = (partSize < fileSize - skip) ? partSize : fileSize - skip; 54 55 // data 56 NSData* data = [handle readDataOfLength:size]; 57 58 // request 59 BOSUploadPartRequest* uploadPartRequest = [[BOSUploadPartRequest alloc] init]; 60 uploadPartRequest.bucket = @"<bucketname>"; 61 uploadPartRequest.key = @"<objectname>"; 62 uploadPartRequest.objectData.data = data; 63 uploadPartRequest.partNumber = i + 1; 64 uploadPartRequest.uploadId = uploadID; 65 66 __block BOSUploadPartResponse* uploadPartResponse = nil; 67 task = [client uploadPart:uploadPartRequest]; 68 task.then(^(BCEOutput* output) { 69 if (output.response) { 70 uploadPartResponse = (BOSUploadPartResponse*)output.response; 71 BOSPart* part = [[BOSPart alloc] init]; 72 part.partNumber = i + 1; 73 part.eTag = uploadPartResponse.eTag; 74 [parts addObject:part]; 75 } 76 }); 77 [task waitUtilFinished]; 78 } 79 80 BOSCompleteMultipartUploadRequest* compMultipartRequest = [[BOSCompleteMultipartUploadRequest alloc] init]; 81 compMultipartRequest.bucket = @"<bucketname>"; 82 compMultipartRequest.key = @"<objectname>"; 83 compMultipartRequest.uploadId = uploadID; 84 compMultipartRequest.parts = parts; 85 86 __block BOSCompleteMultipartUploadResponse* complResponse = nil; 87 task = [client completeMultipartUpload:compMultipartRequest]; 88 task.then(^(BCEOutput* output) { 89 if (output.response) { 90 complResponse = (BOSCompleteMultipartUploadResponse*)output.response; 91 NSLog(@"complte multiparts success!"); 92 } 93 94 if (output.error) { 95 NSLog(@"complte multiparts failure %@", output.error); 96 } 97 }); 98 [task waitUtilFinished]; 99}
取消分块上传
用户可以使用abortMultipartUpload方法取消分块上传。
-
示例代码
Swift1BOSAbortMultipartUploadRequest* abortRequest = [[BOSAbortMultipartUploadRequest alloc] init]; 2abortRequest.bucket = @"bucket"; 3abortRequest.key = @"<objectname>"; 4abortRequest.uploadId = uploadID; 5 6__block BOSAbortMultipartUploadResponse* abortResponse = nil; 7task = [client abortMultipartUpload:abortRequest]; 8task.then(^(BCEOutput* output) { 9 if (output.response) { 10 abortResponse = (BOSAbortMultipartUploadResponse*)output.response; 11 NSLog(@"abort multiparts success!"); 12 } 13 14 if (output.error) { 15 NSLog(@"abort multiparts failure %@", output.error); 16 } 17}); 18[task waitUtilFinished];
获取未完成的分块上传
用户可以使用listMultipartUploads
方法获取Bucket内未完成的分块上传事件。
-
基本流程
- 创建BOSListMultipartUploadsRequest类的实例,传入
<BucketName>
参数。 - 创建BOSClient类的实例,执行BOSClient listMultipartUploads方法。
- listMultipartUploads返回所有未完成的分块上传信息。
- 创建BOSListMultipartUploadsRequest类的实例,传入
-
示例代码
Swift1BOSListMultipartUploadsRequest* listMultipartRequest = [[BOSListMultipartUploadsRequest alloc] init]; 2listMultipartRequest.bucket = @"<bucketname>"; 3 4__block BOSListMultipartUploadsResponse* listMultipartResponse = nil; 5task = [client listMultipartUploads:listMultipartRequest]; 6task.then(^(BCEOutput* output) { 7 if (output.response) { 8 listMultipartResponse = (BOSListMultipartUploadsResponse*)output.response; 9 NSLog(@"list multipart success"); 10 } 11 12 if (output.error) { 13 NSLog(@"list multipart failure %@", output.error); 14 } 15}); 16[task waitUtilFinished];
注意:
- 默认情况下,如果Bucket中的分块上传事件的数目大于1000,则只会返回1000个Object,并且返回结果中IsTruncated的值为True,同时返回nextKeyMarker作为下次读取的起点。
- 若想获取更多分块上传事件,可以使用keyMarker参数分次读取。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSListMultipartUploadsRequest* listMultipartRequest = [[BOSListMultipartUploadsRequest alloc] init]; 15 listMultipartRequest.bucket = @"<bucketname>"; 16 17 __block BOSListMultipartUploadsResponse* listMultipartResponse = nil; 18 BCETask* task = [client listMultipartUploads:listMultipartRequest]; 19 task.then(^(BCEOutput* output) { 20 if (output.response) { 21 listMultipartResponse = (BOSListMultipartUploadsResponse*)output.response; 22 NSLog(@"list multipart success"); 23 } 24 25 if (output.error) { 26 NSLog(@"list multipart failure %@", output.error); 27 } 28 }); 29 [task waitUtilFinished]; 30 31 for (BOSMultipartUpload* upload in listMultipartResponse.uploads) { 32 NSLog(@"upload id : %@", upload.uploadId); 33 } 34}
获取所有已上传的分块信息
用户可以使用listParts
方法获取某个上传事件中所有已上传的块。
-
基本流程
- 创建BOSListPartsRequest类的实例,传入
<BucketName>
,<ObjectKey>
,<UploadId>
参数。 - 创建BOSClient类的实例,执行BOSClient listParts方法。
- listParts返回所有已上传part的信息。
- 创建BOSListPartsRequest类的实例,传入
-
示例代码
Swift1BOSListPartsRequest* listPartsRequest = [[BOSListPartsRequest alloc] init]; 2listPartsRequest.bucket = @"<bucketname>"; 3listPartsRequest.key = @"<objectname>"; 4listPartsRequest.uploadId = @"<upload id>";; 5 6__block BOSListPartsResponse* listPartsResponse = nil; 7BCETask* task = [client listParts:listPartsRequest]; 8task.then(^(BCEOutput* output) { 9 if (output.response) { 10 listPartsResponse = (BOSListPartsResponse*)output.response; 11 NSLog(@"list parts success!"); 12 } 13 14 if (output.error) { 15 NSLog(@"list part failure %@", output.error); 16 } 17}); 18[task waitUtilFinished]; 19 20for (BOSPart* part in listPartsResponse.parts) { 21 NSLog(@"part etag %@", part.eTag); 22}
注意:
- 默认情况下,如果Bucket中的分块上传事件的数目大于1000,则只会返回1000个Object,并且返回结果中IsTruncated的值为True,同时返回NextPartNumberMarker作为下次读取的起点。
- 若想获取更多已上传的分块信息,可以使用PartNumberMarker参数分次读取。
-
完整示例
Swift1#import <BaiduBCEBasic/BaiduBCEBasic.h> 2#import <BaiduBCEBOS/BaiduBCEBOS.h> 3 4void example(void) { 5 // 初始化 6 BCECredentials* credentials = [[BCECredentials alloc] init]; 7 credentials.accessKey = @"<access key>"; 8 credentials.secretKey = @"<secret key>"; 9 BOSClientConfiguration* configuration = [[BOSClientConfiguration alloc] init]; 10 configuration.credentials = credentials; 11 12 BOSClient* client = [[BOSClient alloc] initWithConfiguration:configuration]; 13 14 BOSListPartsRequest* listPartsRequest = [[BOSListPartsRequest alloc] init]; 15 listPartsRequest.bucket = @"<bucketname>"; 16 listPartsRequest.key = @"<objectname>"; 17 listPartsRequest.uploadId = @"<upload id>";; 18 19 __block BOSListPartsResponse* listPartsResponse = nil; 20 BCETask* task = [client listParts:listPartsRequest]; 21 task.then(^(BCEOutput* output) { 22 if (output.response) { 23 listPartsResponse = (BOSListPartsResponse*)output.response; 24 NSLog(@"list parts success!"); 25 } 26 27 if (output.error) { 28 NSLog(@"list part failure %@", output.error); 29 } 30 }); 31 [task waitUtilFinished]; 32 33 for (BOSPart* part in listPartsResponse.parts) { 34 NSLog(@"part etag %@", part.eTag); 35 } 36}