ネットワークが不安定な場合やその他の例外が発生した場合、大きなオブジェクトのダウンロードに失敗することがあります。 場合によっては、複数回試行してもオブジェクトのダウンロードに失敗することがあります。 この問題を解決するために、Object Storage Service (OSS) は再開可能なダウンロード機能を提供しています。 再開可能ダウンロードでは、OSSはオブジェクトを複数のパーツに分割し、各パーツを個別にダウンロードします。 すべてのパーツがダウンロードされた後、OSSはパーツを完全なオブジェクトに結合します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
再開可能ダウンロードを使用するには、
oss:GetObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。
手順
再開可能ダウンロードを使用するには、次の手順を実行します。
元のオブジェクト名とランダムなサフィックスで構成される名前を持つ一時ローカルファイルを作成します。
範囲に基づいてオブジェクトが読み取られるように、HTTPリクエストにRangeヘッダーを指定します。 そして、読み出されたコンテンツは、一時ローカルファイルの対応する位置に書き込まれる。
ダウンロードが完了したら、一時ファイルの名前を宛先ファイルに変更します。 宛先ファイルがすでに存在する場合、ダウンロードされたデータは既存のファイルのデータを上書きします。 それ以外の場合は、新しいファイルが作成されます。
1つのチェックポイント情報がローカルディスク上の別のチェックポイント情報を上書きするか、1つの一時ファイル名が別のファイル名と競合します。 したがって、複数のプログラムまたはスレッドを使用してoss2.resumable_downloadメソッドを同時に呼び出して、同じオブジェクトを同じ宛先ファイルにダウンロードしないでください。
例
次のサンプルコードは、再開可能ダウンロードの実行方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。
# ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。
oss2.resumable_download(bucket, 'exampledir/exampleobject.txt ', 'D :\\ localpath\\examplefile.txt')
# storeパラメーターでディレクトリを指定しない場合は、チェックポイント情報を格納するために、HOMEディレクトリにpy-oss-uploadディレクトリを作成します。
# OSS SDK for Pythonバージョン2.1.0以降を使用する場合は、次のオプションパラメーターを設定できます。
# インポートsys
## ダウンロードするデータの長さがわからない場合, total_bytesの値はNoneです。
# defパーセンテージ (consumed_bytes, total_bytes):
# if total_bytes:
# rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
# print('\r{0}%'.format(rate), end='')
# sys.stdout.flush()
※ storeパラメーターでディレクトリを指定すると, 指定したディレクトリにチェックポイント情報が格納されます。 num_threadsパラメーターを使用して同時ダウンロードスレッドの数を指定する場合は、oss2.defaults.connection_pool_sizeの値が同時ダウンロードスレッドの数以上であることを確認してください。 同時スレッドのデフォルト数は1です。
# oss2.resumable_download (バケット、'exampledir/exampleobject.txt '、'D :\\ localpath\\examplefile.txt' 、# store=oss2.ResumableDownloadStore(root='/tmp') 、## オブジェクトの長さがmultipart_thresholdパラメーターの値以上の場合に再開可能なダウンロードを使用するように指定します。 multipart_thresholdパラメーターはオプションで、デフォルト値は10 MBです。
# multiget_threshold=100*1024、## 各パーツのサイズを指定します。 単位:バイト 有効なパーツサイズは100 KB〜5 GBです。 デフォルトの部品サイズは100 KBです。
# part_size=100*1024、## 再開可能ダウンロードタスクの進行状況を示すために使用するコールバック関数を設定します。
# progress_callback=パーセンテージ、## num_threadsを使用して同時ダウンロードスレッド数を設定する場合は、oss2.defaults.connection_pool_sizeを同時ダウンロードスレッド数以上の値に設定します。 同時スレッドのデフォルト数は1です。
# num_threads=4)