如果僅需要檔案中的部分資料,您可以使用範圍下載,下載指定範圍內的資料。
注意事項
本文以華東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)