大規模なオブジェクトは、不安定なネットワークまたはその他の例外のためにダウンロードに失敗する可能性があり、オブジェクト全体を再度ダウンロードする必要があります。 ただし、オブジェクトは複数回試行してもダウンロードに失敗することがあります。 そのため、OSS は再開可能ダウンロードを提供します。

再開可能ダウンロードのプロセスは以下のとおりです。

  1. 一時的なローカルファイルが作成されます。 ファイル名は、元のオブジェクト名とランダムな接尾辞で構成されています。
  2. HTTP リクエストの Range ヘッダーで指定した範囲に基づいて OSS オブジェクトを読み込み、読み込んだ内容を一時ファイルの対応する位置に書き込みます。
  3. ダウンロードが完了したら、一時ファイルの名前をターゲットファイルに変更します。 ターゲットファイルがすでに存在する場合は上書きされます。 ターゲットファイルが存在しない場合は、新しいファイルが作成されます。

再開可能ダウンロードを有効にするには、oss2.resumable_download を使用します。 以下のパラメーターが含まれています。

パラメーター 説明 必須またはオプション デフォルト値
bucket バケットの名前を指定します。 必須 なし
key オブジェクトの名前を指定します。 必須 なし
filename ローカルファイルの名前を指定します。 OSS オブジェクトはローカルファイルにダウンロードされます。 必須 なし
store ダウンロードの進行状況を記録するローカルファイルを指定します。 ダウンロードの進行状況はファイルに保存されています。 ダウンロードがある時点で失敗した場合、次のダウンロードは記録された進行状況に基づいてその時点から開始されます。 オプション HOMEディレクトリの下の作成された .py-OSS-download ディレクトリ
multipart_threshold オブジェクトサイズの長しきい値を指定します。 オブジェクトサイズがしきい値を超えると、再開可能ダウンロードが有効になります。 オプション 10 MB
part_size パーツのサイズを指定します。 オプション Auto-calculated
progress_callback ダウンロード進捗コールバック関数を指定します オプション なし
num_threads 同時にダウンロードする必要があるパーツの数を指定します。 オプション 1

再開可能ダウンロードを行うには、次のコードを実行します。

# -*- coding: utf-8 -*-
import oss2

# It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>')

Python SDK 2.1.0 以降では、次のコードに示すように、再開可能ダウンロード用のオプションパラメーターをサポートしています。

# -*- coding: utf-8 -*-
import oss2

# It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

# Make sure that the value of oss2.defaults.connection_pool_size is no less than the number of the download threads, and the value of part_size is no less than the value of oss2.defaults.multiget_part_size.
oss2.resumable_download(bucket, '<yourObjectName>', '<yourLocalFile>',
  store=oss2.ResumableDownloadStore(root='/tmp'),
  multiget_threshold=20*1024*1024,
  part_size=10*1024*1024,
  num_threads=3)
メソッドを呼び出して、複数のプログラム(スレッド)が同一オブジェクトを同一ターゲットファイルに同時にダウンロードすることを許可しないでください。 メソッドを呼び出して、複数のプログラム(スレッド)が同一オブジェクトを同一ターゲットファイルに同時にダウンロードすることを許可しないでください。