如果僅需要文件中的部分數據,您可以使用范圍下載,下載指定范圍內的數據。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產品訪問OSS,請使用內網Endpoint。關于OSS支持的Region與Endpoint的對應關系,請參見OSS地域和訪問域名。
本文以從環境變量讀取訪問憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS域名新建OSSClient為例。如果您希望通過自定義域名、STS等方式新建OSSClient,請參見初始化。
要范圍下載,您必須有
oss:GetObject
權限。具體操作,請參見為RAM用戶授權自定義的權限策略。
指定正常的下載范圍
以下代碼用于指定正常的下載范圍來下載文件。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 對于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
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 創建大小為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)