如果仅需要文件中的部分数据,您可以使用范围下载,下载指定范围内的数据。
指定正常的下载范围
以下代码用于指定正常的下载范围来下载文件:
# -*- coding: utf-8 -*- import oss2 # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>') # Endpoint以杭州为例,其它Region请按实际情况填写。 bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>') # 对于1000字节大小的文件,正常的下载范围取值为0~999。 # 获取0~999字节范围内的数据,包括0和999,共1000个字节的数据。如果指定的范围无效(比如开始或结束位置的指定值为负数,或指定值大于文件大小),则下载整个文件。 object_stream = bucket.get_object('<yourObjectName>', byte_range=(0, 999))
指定异常的下载范围
假设现有大小为1000 Bytes的Object,则指定的正常下载范围应为0~999。如果指定范围不在有效区间,会导致Range不生效,响应返回值为200,并传送整个Object内容。请求不合法的示例及返回说明如下:
- 若指定了Range: bytes=500~2000,此时范围末端取值不在有效区间,返回整个文件的内容,且HTTP Code为200。
- 若指定了Range: bytes=1000~2000,此时范围首端取值不在有效区间,返回整个文件的内容,且HTTP Code为200。
兼容行为范围下载
在请求中增加请求头x-oss-range-behavior:standard,则改变指定范围不在有效区间时OSS的下载行为。假设现有大小为1000 Bytes的Object,
- 若指定了Range: bytes=500~2000,此时范围末端取值不在有效区间,返回500~999字节范围内容,且HTTP Code为206。
- 若指定了Range: bytes=1000~2000,此时范围首端取值不在有效区间,返回HTTP Code为416,错误码为InvalidRange。
以下代码用于兼容行为范围下载:
# -*- coding: utf-8 -*- import oss2 # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>') # Endpoint以杭州为例,其它Region请按实际情况填写。 bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>') # 创建大小为1000 Bytes的object。 object_name = 'rangeTest.txt' content = 'a' * 1000 bucket.put_object(object_name, content) headers = {'x-oss-range-behavior':'standard'} # 指定兼容行为。 # 若范围末端取值不在有效区间,返回500~999字节范围内容,且HTTP Code为206。 object_stream = bucket.get_object(object_name, byte_range=(500, 2000), headers=headers) print('standard get 500~2000 http status code:', object_stream.status) print('standard get 500~2000 contnet_length:', object_stream.content_length) try: # 若范围首端取值不在有效区间,则抛出异常,返回HTTP Code为416,错误码为InvalidRange。 object_stream = bucket.get_object(object_name, byte_range=(1000, 2000), headers=headers) except oss2.exceptions.ServerError as e: print('standard get 1000~2000 http status code:', e.status) print('standard get 1000~2000 error code:', e.code)