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

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

最終更新日:Feb 26, 2024

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

使用上の注意

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

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

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

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

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

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

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'yourBucketName')

# オブジェクトのサイズが1,000バイトの場合、有効な範囲はバイト0からバイト999までです。 
# バイト0からバイト999までの範囲 (合計1,000バイト) のデータを照会します。 指定された値の範囲が無効な場合、オブジェクト全体がダウンロードされます。 たとえば、指定された範囲の開始または終了が負の数である場合、または指定された値がオブジェクトサイズよりも大きい場合、オブジェクトのすべてのコンテンツがダウンロードされます。 
object_stream = bucket.get_object('<yourObjectName>', byte_range=(0, 999)) 

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

サイズが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エラーコードを返します。

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

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'yourBucketName')

# サイズが1,000バイトのオブジェクトを作成します。 
object_name = 'rangeTest.txt'
content = 'a' * 1000
bucket.put_object(object_name, content)

headers = {'x-oss-range-behavior':'standard'}

# 範囲の末尾の値が無効な場合、OSSはバイト500からバイト999の範囲内のデータを返し、HTTPステータスコードは206します。 
object_stream = bucket.get_object(object_name, byte_range=(500, 2000), headers=headers)
印刷 ('standard get 500 ~ 2000 httpステータスコード: ', object_stream.status)
プリント ('standard get 500 ~ 2000 contnet_length:', object_stream.content_length)

トライ:
    # 範囲の先頭の値が無効な場合、例外がスローされます。 その後、OSSはHTTPステータスコード416とエラーコードInvalidRangeを返します。 
    object_stream = bucket.get_object(object_name, byte_range=(1000, 2000), headers=headers)
oss2.exceptions.ServerErrorを除くe:
    print('standard get 1000 ~ 2000 httpステータスコード: '、e.status)
    プリント ('standard get 1000 ~ 2000エラーコード: '、e.code) 

参考資料

  • 範囲のダウンロードを実行するために使用される完全なサンプルコードについては、『GitHub』をご参照ください。

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