下载文件
BOS Python SDK提供了丰富的文件下载接口,用户可以通过以下方式从BOS中下载文件:
- 简单流式下载
- 下载到本地文件
- 下载为字符串
- 断点续传下载
- 范围下载
- 获取下载进度
简单的读取Object
用户可以通过如下代码将Object读取到一个流中:
response = bos_client.get_object(bucket_name, object_key)
s = response.data
# 处理Object
...
# 关闭流
response.data.close()
直接下载Object到文件或字符串
用户可以参考如下代码将Object下载到指定文件:
bos_client.get_object_to_file(bucket_name, object_key, file_name)
用户可以参考如下代码将Object下载到字符串:
result = bos_client.get_object_as_string(bucket_name, object_key)
print(result)
范围下载
为了实现更多的功能,可以通过使用指定range
参数来指定下载范围,实现更精细化地获取Object。如果指定的下载范围是0 - 100,则返回第0到第100个字节的数据,包括第100个,共101字节的数据,即[0, 1000]。
range = [0,1000]
#返回指定范围的Object数据
print(bos_client.get_object_as_string(bucket_name, object_key, range = range))
#返回指定范围的Object数据到文件中
bos_client.get_object_to_file(bucket_name, object_key, file_name, range = range)
通过get_object_as_string和get_object_to_file的range参数可以设置返回Object的范围。用户也可以用此功能实现文件的分段下载和断点续传。
其他使用方法
获取Object的存储类型
Object的storage class属性分为STANDARD
(标准存储), STANDARD_IA
(低频存储),COLD
(冷存储)和ARCHIVE
(归档存储),通过如下代码可以代码获得Object的storage class属性:
response = bos_client.get_object_meta_data(bucket_name, object_key)
print(response.metadata.bce_storage_class)
只获取ObjectMetadata
通过get_object_meta_data
方法可以只获取Object的元数据,而非Object实体。如下代码所示:。
response = bos_client.get_object_meta_data(bucket_name, object_key)
get_object_meta_data
方法返回的解析类中可供调用的参数有:
参数 | 说明 |
---|---|
content_length | Object的大小 |
e_tag | Object的HTTP协议实体标签 |
bce_meta | 如果在PutObject指定了user_metadata自定义meta,则返回此项() |
storageClass | Object的存储类型 |
bce_restore | 归档存储对象处于正在取回或已经取回时返回。对于正在取回的归档对象bce_restore取值为 ongoing-request="true" ;对于已取回的归档对象bce_restore取值为 ongoing-request="false", expiry-date="Wed, 07 Nov 2019 00:00:00 GMT" 。其中expiry-date表示对象取回后的失效时间,此时间为格林尼治时间。 |
获取下载进度
Python SDK支持在下载过程中实时提供下载进度信息。目前支持下载object 到文件。需要在对应接口上增加progress_callback参数,并提供进度条回调函数,也可调用工具类中的默认进度条回调函数。
回调函数示例如下:
def percentage(consumed_bytes, total_bytes):
"""进度条回调函数,计算当前完成的百分比
:param consumed_bytes: 已经上传/下载的数据量
:param total_bytes: 总数据量
"""
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
print('\r{0}% '.format(rate))
sys.stdout.flush()
# progress_callback为可选参数,用于实现进度条功能.~~~~
bos_client.get_object_to_file(bucket_name, key, download, progress_callback=percentage)
推荐使用工具类中的默认进度条回调函数(utils.default_progress_callback),目前支持百分比和进度条展示,示例如下:
# 引入 SDK 工具类包
from baidubce import utils
# progress_callback为可选参数,用于实现进度条功能.
bos_client.get_object_to_file(bucket_name, key, download, progress_callback=utils.default_progress_callback)
- get_object_to_file 代码示例
# 引入 SDK 工具类包
from baidubce import utils
# progress_callback为可选参数,用于实现进度条功能.
bos_client.get_object_to_file(bucket_name, key, download, progress_callback=utils.default_progress_callback)
支持单链接限速
对象存储BOS对单Bucket的公网带宽阈值为10Gbit/s,内网带宽阈值为50Gbit/s,当用户的上传或下载占用带宽达到带宽限制阈值时,会返回RequestRateLimitExceeded的错误码。为保证用户能够正常使用服务,BOS支持在进行上传、下载等行为时进行流量控制,保证大流量服务占用带宽不会对其他应用服务造成影响。
下载类请求接口示例
限速值的取值范围为819200~838860800,单位为bit/s,即100KB/s~100MB/s。限速值取值必须为数字,BOS将按照指定的限速值对此次请求进行限速,当限速值不在此范围或不合法时将返回400错误码。
traffic_limit_speed = 819200 * 5
# get obj url by traffic limit
param = {}
param[b'x-bce-traffic-limit'] = traffic_limit_speed
url = bos_client.generate_pre_signed_url(bucket_name, key, timestamp=1649923427,
expiration_in_seconds=1000,
params=param)
__logger.debug("[Sample] get object url is %s", url)
# get object into file
bos_client.get_object_to_file(bucket_name, key, download, traffic_limit=traffic_limit_speed)
__logger.debug("[Sample] get object into file, file size:%s", os.path.getsize(download))