查看Bucket中的Object
更新时间:2025-04-01
简单查询
查看Bucket中Object列表。
基本流程
- 创建BosClient类的实例。
- 执行BosClient.listObjects(bucketName)方法,会返回ListObjectsResult类的实例。
- 返回信息见ListObjectsResult对象的各个成员。
示例代码
Plain Text
1let listObjectsResult: ListObjectsResult;
2try {
3 listObjectsResult = await bosClient.listObjects(bucketName);
4 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
5 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
6 }
7} catch (bosResponse) {
8 logger.error(`errCode: ${bosResponse.error.code}`)
9 logger.error(`requestId: ${bosResponse.error.requestId}`)
10 logger.error(`errMessage: ${bosResponse.error.message}`)
11 logger.error(`statusCode: ${bosResponse.statusCode}`)
12}
说明:
- 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中IsTruncated值为True,并返回NextMarker做为下次读取的起点。
- 若想获取更多的Object,可以使用Marker参数分次读取。
完整代码
Plain Text
1import { logger, Credential, BosClient, ClientOptions} from "bos"
2import { ListObjectsResult, ObjectSummaryType } from "bos/src/main/ets/bos/api/DataType"
3
4let credential = new Credential(AccessKeyID, SecretAccessKey, Token); //STS返回的临时AK/SK及Token
5let clientOptions = new ClientOptions();
6clientOptions.endpoint = "bj.bcebos.com"; //传入Bucket所在区域域名
7let bosClient = new BosClient(credential, clientOptions); // 创建BosClient
8let bucketName = "test-bucket-harmony";
9
10let listObjectsResult: ListObjectsResult;
11try {
12 listObjectsResult = await bosClient.listObjects(bucketName);
13 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
14 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
15 }
16} catch (bosResponse) {
17 logger.error(`errCode: ${bosResponse.error.code}`)
18 logger.error(`requestId: ${bosResponse.error.requestId}`)
19 logger.error(`errMessage: ${bosResponse.error.message}`)
20 logger.error(`statusCode: ${bosResponse.statusCode}`)
21}
扩展查询
用户可以通过设置ListObjectsArgs参数来完成更多扩展查询操作设置。ListObjectsArgs中可以设置的扩展参数如下:
参数名称 | 说明 | 默认值 |
---|---|---|
delimiter | 是一个分隔符,用来对objectKey进行分层。通常与prefix配合在查询模拟文件夹中使用。从prefix开始到第一次出现delimiter字符之间的objectKey称为:commonPrefixes | - |
marker | 是一个字符串,用来设定返回结果的起始位置。设定Marker值之后,返回的Object会从Marker值之后按字母排序开始返回。 | - |
maxKeys | 设定此次返回Object的最大个数,不可超过1000。 | - |
prefix | 设定objectKey的前缀,前缀是指objectKey包含并以Prefix的值作为开始。通常与Delimiter配合在查询模拟文件夹中使用。 | - |
示例代码
示例一:
Plain Text
1import { logger, Credential, BosClient, ClientOptions} from "bos"
2import { ListObjectsResult, ObjectSummaryType, ListObjectsArgs } from "bos/src/main/ets/bos/api/DataType"
3
4let credential = new Credential(AccessKeyID, SecretAccessKey, Token); //STS返回的临时AK/SK及Token
5let clientOptions = new ClientOptions();
6clientOptions.endpoint = "bj.bcebos.com"; //传入Bucket所在区域域名
7let bosClient = new BosClient(credential, clientOptions); // 创建BosClient
8let bucketName = "test-bucket-harmony";
9
10let args = new ListObjectsArgs();
11args.delimiter = "/";
12args.maxKeys = 3;
13args.prefix = "fun";
14args.marker = "123";
15let listObjectsResult: ListObjectsResult;
16try {
17 listObjectsResult = await bosClient.listObjects(bucketName, args);
18 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
19 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
20 }
21} catch (bosResponse) {
22 logger.error(`errCode: ${bosResponse.error.code}`)
23 logger.error(`requestId: ${bosResponse.error.requestId}`)
24 logger.error(`errMessage: ${bosResponse.error.message}`)
25 logger.error(`statusCode: ${bosResponse.statusCode}`)
26}
示例二:使用nextmarker完整示例。
Plain Text
1import { logger, Credential, BosClient, ClientOptions} from "bos"
2import { ListObjectsResult, ObjectSummaryType, ListObjectsArgs } from "bos/src/main/ets/bos/api/DataType"
3
4
5let credential = new Credential(AccessKeyID, SecretAccessKey, Token); //STS返回的临时AK/SK及Token
6let clientOptions = new ClientOptions();
7clientOptions.endpoint = "bj.bcebos.com"; //传入Bucket所在区域域名
8let bosClient = new BosClient(credential, clientOptions); // 创建BosClient
9let bucketName = "test-bucket-harmony";
10
11let args = new ListObjectsArgs();
12args.delimiter = "/";
13args.maxKeys = 3;
14args.prefix = "test";
15let listObjectsResult: ListObjectsResult;
16try {
17 listObjectsResult = await bosClient.listObjects(bucketName, args);
18 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
19 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
20 }
21 if (listObjectsResult.isTruncated) {
22 args.marker = listObjectsResult.nextMarker as string;
23 }
24 listObjectsResult = await bosClient.listObjects(bucketName, args);
25 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
26 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
27 }
28} catch (bosResponse) {
29 logger.error(`errCode: ${bosResponse.error.code}`)
30 logger.error(`requestId: ${bosResponse.error.requestId}`)
31 logger.error(`errMessage: ${bosResponse.error.message}`)
32 logger.error(`statusCode: ${bosResponse.statusCode}`)
33}
查询prefix
由于BOS本身是一个KV的存储系统,所以原则上并不会存在“文件夹”的概念,但您可以通过 delimiter
和 prefix
参数的配合进行文件夹功能模拟。
假设Bucket中有5个文件:bos.jpg,fun/,fun/test.jpg,fun/movie/001.avi,fun/movie/007.avi,可以把 “/” 符号作为分隔符模拟文件夹。
递归列出prefix下所有文件
可以通过设置 prefix
参数来获取某个模拟文件夹下所有的文件:
Plain Text
1let args = new ListObjectsArgs();
2args.prefix = "fun/";
3
4let listObjectsResult: ListObjectsResult;
5try {
6 listObjectsResult = await bosClient.listObjects(bucketName, args);
7 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
8 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
9 }
10} catch (bosResponse) {
11 logger.error(`errCode: ${bosResponse.error.code}`)
12 logger.error(`requestId: ${bosResponse.error.requestId}`)
13 logger.error(`errMessage: ${bosResponse.error.message}`)
14 logger.error(`statusCode: ${bosResponse.statusCode}`)
15}
输出:
Plain Text
1name: fun/ size: 0 storageClass: COLD
2name: fun/movie/001.avi size: 0 storageClass: COLD
3name: fun/movie/007.avi size: 0 storageClass: COLD
4name: fun/test.jpg size: 0 storageClass: COLD
查看prefix下的文件和子文件夹
在 prefix
和 delimiter
结合的情况下,可以列出模拟文件夹下的文件和子文件夹:
Plain Text
1import { logger, Credential, BosClient, ClientOptions} from "bos"
2import { ListObjectsResult, ObjectSummaryType, ListObjectsArgs, PrefixType } from "bos/src/main/ets/bos/api/DataType"
3
4let credential = new Credential(AccessKeyID, SecretAccessKey, Token); //STS返回的临时AK/SK及Token
5let clientOptions = new ClientOptions();
6clientOptions.endpoint = "bj.bcebos.com"; //传入Bucket所在区域域名
7let bosClient = new BosClient(credential, clientOptions); // 创建BosClient
8let bucketName = "test-bucket-harmony";
9
10let args = new ListObjectsArgs();
11args.delimiter = "/";
12args.prefix = "fun/";
13let listObjectsResult: ListObjectsResult;
14try {
15 listObjectsResult = await bosClient.listObjects(bucketName, args);
16 for (let objectInfo of listObjectsResult.contents as ObjectSummaryType[]) {
17 logger.info("objects:");
18 logger.info(`name: ${objectInfo.key} size: ${objectInfo.size} storageClass: ${objectInfo.storageClass}`);
19 }
20 logger.info("commonPrefix:");
21 // 遍历所有CommonPrefix
22 for(let prefix of listObjectsResult.commonPrefixes as PrefixType[]) {
23 logger.info(`commonPrefix: ${prefix.prefix}`);
24 }
25} catch (bosResponse) {
26 logger.error(`errCode: ${bosResponse.error.code}`)
27 logger.error(`requestId: ${bosResponse.error.requestId}`)
28 logger.error(`errMessage: ${bosResponse.error.message}`)
29 logger.error(`statusCode: ${bosResponse.statusCode}`)
30}
输出:
Plain Text
1objects:
2name: fun/ size: 0 storageClass: COLD
3name: fun/test.jpg size: 0 storageClass: COLD
4commonPrefix:
5commonPrefix: fun/movie/
说明:返回的结果中, objects 的列表中给出的是fun文件夹下的文件。而 commonPrefixs 的列表中给出的是fun文件夹下的所有子文件夹。可以看出 fun/movie/001.avi , fun/movie/007.avi 两个文件并没有被列出来,因为它们属于 fun 文件夹下的 movie 子文件夹下的文件。