查看Bucket中的Object
更新时间:2022-10-21
简单查询
查看Bucket中Object列表。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient listObjects方法,会返回BOSListObjectsResponse类的实例。
- 可以对BOSListObjectsResponse类型的contents字段进行枚举,获取key/lastModified/eTag/size/owner。
示例代码
Swift
1BOSListObjectsRequest* 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参数分次读取,请参考扩展查询。
完整示例
Swift
1#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。
示例代码
Swift
1BOSListObjectsRequest* 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];
完整示例
示例一:
Swift
1#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的完整示例。
Swift
1#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
参数来获取某个模拟文件夹下所有的文件:
Swift
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];
输出:
Swift
1Objects:
2fun/
3fun/movie/001.avi
4fun/movie/007.avi
5fun/test.jpg
查看模拟文件夹下的文件和子文件夹
在prefix
和delimiter
结合的情况下,可以列出模拟文件夹下的文件和子文件夹:
Swift
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}
输出:
Swift
1Objects:
2fun/
3fun/test.jpg
4
5CommonPrefixs:
6fun/movie/
说明: 返回的结果中,
contents
的列表中给出的是fun文件夹下的文件。而commonPrefixs
的列表中给出的是fun文件夹下的所有子文件夹。可以看出fun/movie/001.avi
,fun/movie/007.avi
两个文件并没有被列出来,因为它们属于fun
文件夹下的movie
子文件夹下的文件。