すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:部分ダウンロード

最終更新日:Dec 19, 2023

範囲ダウンロードを使用して、オブジェクトから指定した範囲のデータをダウンロードできます。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。

  • 範囲のダウンロードを実行するには、oss:GetObject権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。

ダウンロードする有効な範囲を指定する

次のサンプルコードは、データをダウンロードするための有効な範囲を指定する方法の例を示しています。

#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
    /* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
    std::stringエンドポイント="https://oss-cn-hangzhou.aliyuncs.com";
    /* バケットの名前を指定します。 例: examplebucket. */
    std::string BucketName = "examplebucket";
    /* オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 例: 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クライアント (Endpoint, credentialsProvider, conf);

    /* オブジェクトを照会します。 */
    GetObjectRequestリクエスト (BucketName, ObjectName);
    /* ダウンロード範囲を指定します。 */
    request.setRange(0、1);
    auto outcome = client.GetObject (リクエスト);

    if (!outcome.isSuccess ()) {    
        /* 例外を処理します。 */
        std::cout << "getObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
         return -1;  
    }

    /* ネットワークリソースなどのリソースを解放します。 */
    ShutdownSdk();
    0を返します。} 

データをダウンロードする無効な範囲を指定する

サイズが1,000バイトのオブジェクトの場合、有効な範囲はバイト0からバイト999までです。 指定された範囲がバイト0からバイト999の範囲内にない場合、範囲は有効になりません。 この場合、OSSはHTTPステータスコード200とオブジェクト全体のデータを返します。 次の例は、無効なリクエストと返された結果を示しています。

  • Range: bytesを500-2000に設定した場合、範囲の末尾の値は無効です。 この場合、OSSはHTTPステータスコード200とオブジェクト全体のデータを返します。

  • Range: bytesを1000-2000に設定した場合、範囲の先頭の値は無効です。 この場合、OSSはHTTPステータスコード200とオブジェクト全体のデータを返します。

範囲別にデータをダウンロードする標準動作を指定する

リクエストヘッダーにx-oss-range-behavior:standardを追加すると、指定された範囲が有効な範囲内にない場合、ダウンロードの動作が変更されます。 サイズが1,000バイトのオブジェクトの場合:

  • Range: bytesを500-2000に設定した場合、範囲の末尾の値は無効です。 この場合、OSSはHTTPステータスコード206と、バイト500からバイト999の範囲内のデータを返します。

  • Range: bytesを1000-2000に設定した場合、範囲の先頭の値は無効です。 この場合、OSSはHTTPステータスコード416とInvalidRangeエラーコードを返します。

次のサンプルコードでは、範囲ごとにデータをダウンロードする標準の動作を指定する方法の例を示します。

#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
    /* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
    std::stringエンドポイント="https://oss-cn-hangzhou.aliyuncs.com";
    /* バケットの名前を指定します。 例: examplebucket. */
    std::string BucketName = "examplebucket";
    /* サイズが1,000バイトのオブジェクトを指定します。 */
    /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: 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クライアント (Endpoint, credentialsProvider, conf);

    /* オブジェクトを照会します。 */
    GetObjectRequestリクエスト (BucketName, ObjectName);
    /* ダウンロード範囲を指定します。 */    
    /* 範囲の末尾の値が無効な場合、バイト500からバイト999までのデータ範囲とHTTPステータスコード206が返されます。 */
    request.setRange(500、2000、true);
    auto outcome = client.GetObject (リクエスト);

    /* 範囲の先頭の値が無効な場合、例外がスローされます。 HTTPステータスコード416とInvalidRangeエラーメッセージが返されます。 */
    request.setRange(1000、2000、true);
    outcome = client.GetObject (リクエスト);

    if (!outcome.isSuccess ()) {    
        /* 例外を処理します。 */
        std::cout << "getObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
         return -1;  
    }

    /* ネットワークリソースなどのリソースを解放します。 */
    ShutdownSdk();
    0を返します。} 

参考資料

範囲ダウンロードを実行するために呼び出すことができるAPI操作の詳細については、「GetObject」をご参照ください。