搜索本产品文档关键词
列举存储空间中的文件
所有文档
menu

BOS 对象存储

列举存储空间中的文件

BOS SDK支持用户通过以下两种方式列举出object:

  • 简单列举
  • 通过参数复杂列举

除此之外,用户还可在列出文件的同时模拟文件夹

简单列举

当用户完成一系列上传后,可能会需要查看在指定Bucket中的全部Object,可以通过如下代码实现:

Python
1response = bos_client.list_objects(bucket_name)
2for object in response.contents:
3    print(object.key)

注意: 1. 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中is_truncated值为True,并返回next_marker做为下次读取的起点。 2. 若想增大返回Object的数目,可以使用Marker参数分次读取。

也可以一次列举当前Bucket的所有的Object。

Python
1for object in bos_client.list_all_objects(bucket_name):
2    print(object.key)

通过参数复杂列举

list_objects方法其他可选的参数有:

参数
说明
prefix 限定返回的object key必须以Prefix作为前缀。
delimiter 是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现Delimiter字符之间的object作为一组元素: CommonPrefixes。
max_keys 限定此次返回object的最大数,此数值不能超过1000,如果不设定,默认为1000。
marker 设定结果从Marker之后按字母排序的第一个开始返回。

注意:

  1. 如果有Object以Prefix命名,当仅使用Prefix查询时,返回的所有Key中仍会包含以Prefix命名的Object,详见递归列出目录下所有文件
  2. 如果有Object以Prefix命名,当使用Prefix和Delimiter组合查询时,返回的所有Key中会有Null,Key的名字不包含Prefix前缀,详见查看目录下的文件和子目录

下面我们分别以几个案例说明通过参数列举的方法:

指定最大返回条数

Python
1    max_keys = 500
2    # 指定最大返回条数为500
3    response = bos_client.list_objects(bucket_name, max_keys = max_keys)
4    for obj in response.contents:
5        print(obj.key)

返回指定前缀的object

Python
1    prefix = "test"
2    # 指定返回前缀为test的object
3    response = bos_client.list_objects(bucket_name, prefix = prefix)
4    for obj in response.contents:
5        print(obj.key)

从指定Object后返回

Python
1    marker = "object"
2    # 用户可以定义不包括某object,从其之后开始返回
3    response = bos_client.list_objects(bucket_name, marker = marker)
4    for obj in response.contents:
5        print(obj.key)

分页获取所有Object

Python
1    isTruncated = True
2    # 用户可设置每页最多500条记录
3    max_keys = 500
4    marker = None
5    while isTruncated:
6        response = bos_client.list_objects(bucket_name, max_keys = max_keys, marker=marker)
7        for obj in response.contents:
8        	print(obj.key)
9        isTruncated = response.is_truncated
10        marker = getattr(response,'next_marker',None)

分页获取所有特定Object后的结果

Python
1    # 用户可设置每页最多500条记录,并从某特定object之后开始获取
2    max_keys = 500
3    marker = "object"
4    isTruncated = True
5    while isTruncated:
6    	response = bos_client.list_objects(bucket_name, max_keys = max_keys, marker=marker)
7        for obj in response.contents:
8        	print(obj.key)
9        isTruncated = response.is_truncated
10        marker = getattr(response,'next_marker',None)

分页获取所有指定前缀的Object结果

Python
1    # 用户可设置分页获取指定前缀的Object,每页最多500条记录
2    max_keys = 500
3    prefix = "object"
4    isTruncated = True
5    while isTruncated:
6    	response = bos_client.list_objects(bucket_name, prefix = prefix)
7    	for obj in response.contents:
8    	    print(obj.key)
9    	isTruncated = response.is_truncated
10        marker = getattr(response,'next_marker',None)

list_objects方法返回的解析类中可供调用的参数有:

参数
说明
name Bucket名称
prefix 匹配以prefix开始到第一次出现Delimiter字符之间的object作为一组元素返回
marker 本次查询的起点
max_keys 请求返回的最大数目
is_truncated 指明是否所有查询都返回了;false-本次已经返回所有结果,true-本次还没有返回所有结果
contents 返回的一个Object的容器
+key Object名称
+last_modified 此Object最后一次被修改的时间
+e_tag Object的HTTP协议实体标签
+size Object的内容的大小(字节数)
+owner Object对应Bucket所属用户信息
++id Bucket Owner的用户ID
++display_name Bucket Owner的名称
next_marker 只要IsTruncated为true,就会返回next_marker,作为下次查询marker的值
common_prefixes 仅当指定delimiter,才会返回此项

list_all_objects方法返回contents的生成器(Generator),并且不受单次最大返回1000个结果的限制,会返回所有的结果。

模拟文件夹功能

在BOS的存储结果中是没有文件夹这个概念的,所有元素都是以Object来存储,但BOS的用户在使用数据时往往需要以文件夹来管理文件。 因此,BOS提供了创建模拟文件夹的能力,其本质上来说是创建了一个size为0的Object。对于这个Object可以上传下载,只是控制台会对以”/“结尾的Object以文件夹的方式展示。

用户可以通过 Delimiter 和 Prefix 参数的配合模拟出文件夹功能。Delimiter 和 Prefix 的组合效果是这样的:

如果把 Prefix 设为某个文件夹名,就可以罗列以此 Prefix 开头的文件,即该文件夹下递归的所有的文件和子文件夹(目录)。文件名在Contents中显示。 如果再把 Delimiter 设置为 “/” 时,返回值就只罗列该文件夹下的文件和子文件夹(目录),该文件夹下的子文件名(目录)返回在 CommonPrefixes 部分,子文件夹下递归的文件和文件夹不被显示。

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

如下是几个应用方式:

列出Bucket内所有文件

当用户需要获取Bucket下的所有文件时,可以参考分页获取所有Object

递归列出目录下所有文件

可以通过设置 Prefix 参数来获取某个目录下所有的文件:

Python
1    prefix = "fun/"
2    print("Objects:")
3    # 递归列出fun目录下的所有文件
4    response = bos_client.list_objects(bucket_name, prefix = prefix)
5    for obj in response.contents:
6        print(obj.key)

输出:

Python
1    Objects:
2    fun/
3    fun/movie/001.avi
4    fun/movie/007.avi
5    fun/test.jpg

查看目录下的文件和子目录

PrefixDelimiter 结合的情况下,可以列出目录下的文件和子目录:

Python
1    # "/" 为文件夹的分隔符
2    delimiter = "/"
3    prefix = "fun/"
4    # 列出fun目录下的所有文件和文件夹
5    response = bos_client.list_objects(bucket_name, prefix = prefix, delimiter = delimiter)
6    print("Objects:")
7    for obj in response.contents:
8        print(obj.key)
9        
10    # 遍历所有CommonPrefix
11    print("CommonPrefixs:")
12    for obj in response.common_prefixes:
13        print(obj.prefix)

输出:

Python
1    Objects:
2    fun/
3    fun/test.jpg
4
5    CommonPrefixs:
6    fun/movie/

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

列举Bucket中object的存储属性

用户除了可以查看指定Bucket中的全部Object,还可以查看Object的存储类型,实现代码如下:

Python
1    response = bos_client.list_objects(bucket_name)
2    for obj in response.contents:
3        print('object:{}, storage_class:{}'.format(obj.key, obj.storage_class))
上一篇
获取文件下载URL
下一篇
Object权限控制