如果僅需要檔案中的部分資料,您可以使用範圍下載,下載指定範圍內的資料。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見訪問網域名稱和資料中心。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見建立OssClient。
要範圍下載,您必須有
oss:GetObject
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
指定正常的下載範圍
以下代碼用於指定正常的下載範圍來下載檔案。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS帳號資訊。*/
/* 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 擷取檔案。*/
GetObjectRequest request(BucketName, ObjectName);
/* 設定下載範圍。*/
request.setRange(0, 1);
auto outcome = client.GetObject(request);
if (!outcome.isSuccess ()) {
/* 異常處理。*/
std::cout << "getObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
指定異常的下載範圍
假設現有大小為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。
以下代碼用於標準行為範圍下載。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS帳號資訊。*/
/* 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 指定大小為1000 Bytes的檔案。*/
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "yourObjectName";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 擷取檔案。*/
GetObjectRequest request(BucketName, ObjectName);
/* 設定下載範圍。*/
/* 範圍末端取值不在有效區間,返回500~999位元組範圍內容,且HTTP Code為206。*/
request.setRange(500, 2000, true);
auto outcome = client.GetObject(request);
/* 範圍首端取值不在有效區間,則會拋出異常。返回HTTP Code為416,錯誤碼為InvalidRange。*/
request.setRange(1000, 2000, true);
outcome = client.GetObject(request);
if (!outcome.isSuccess ()) {
/* 異常處理。*/
std::cout << "getObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
相關文檔
關於範圍下載的API介面說明,請參見GetObject。