ネットワークが不安定な場合やその他の例外が発生した場合、大きなオブジェクトのダウンロードに失敗することがあります。 場合によっては、複数回試行してもオブジェクトのダウンロードに失敗することがあります。 この問題を解決するために、Object Storage Service (OSS) は再開可能なダウンロード機能を提供しています。 再開可能ダウンロードでは、OSSはオブジェクトを複数のパーツに分割し、各パーツを個別にダウンロードします。 すべてのパーツがダウンロードされた後、OSSはパーツを完全なオブジェクトに結合します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
再開可能ダウンロードを使用するには、
oss:GetObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。
実装方法
OSSClient.ResumableDownloadObjectメソッドを使用して、再開可能なダウンロードを実装できます。 次の表に、DownloadObjectRequestに設定できるパラメーターを示します。
パラメーター | 説明 | 必須 | デフォルト値 | メソッド |
バケット | バケットの名前。 | 必須 | なし | コンストラクター |
キー | ダウンロードするOSSオブジェクトのフルパス。 | 必須 | なし | コンストラクター |
filePath | オブジェクトのダウンロード先のローカルファイルのフルパス。 | 任意 | ダウンロードしたオブジェクトの名前 | コンストラクター |
partSize | 各部分のサイズ。 有効な値: 100 KB〜5 GB。 | 任意 | 8 MB | setPartSize |
threadNum | 同時にダウンロードできるパーツの数。 | 任意 | 3 | コンストラクタまたはsetThreadNum |
checkpointDir | マルチパートダウンロードタスクの結果を記録するチェックポイントファイルのパス。 このパラメーターは、再開可能なダウンロード機能を有効にする場合に必要です。 このファイルにはダウンロードの進行状況に関する情報が格納されています。 パーツのダウンロードに失敗した場合、ファイルに記録された位置から次のダウンロード操作が続行されます。 オブジェクトがダウンロードされた後、チェックポイントファイルは削除されます。 | 任意 | ダウンロードされたオブジェクトが格納されているディレクトリ | コンストラクタまたはsetCheckpointDir |
サンプルコード
次のコードは、再開可能なダウンロードを実行する方法の例を示しています。
#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";
/* examplefile.txtという名前のローカルファイルとして、ローカルパスD :\\ localpathにオブジェクトをダウンロードします。 指定されたパスに同じ名前のファイルがすでに存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。 */
/* ローカルファイルのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。 */
std::string DownloadFilePath = "D :\\ localpath\\examplefile.txt";
/* チェックポイントファイルが保存されているディレクトリを指定し、指定されたディレクトリが存在することを確認します (D :\\ localpathなど) 。 */
/* チェックポイントファイルは、ダウンロードが中断されると生成されます。 ダウンロードタスクを再開する場合は、チェックポイントファイルのフルパスを指定する必要があります。 オブジェクトがダウンロードされた後、チェックポイントファイルは削除されます。 */
std::string CheckpointFilePath = "D :\\ localpath";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* 再開可能ダウンロードを開始します。 */
DownloadObjectRequestリクエスト (BucketName、ObjectName、DownloadFilePath、CheckpointFilePath);
auto outcome = client.ResumableDownloadObject (リクエスト);
if (!outcome.isSuccess()) {
/* 例外を処理します。 */
std::cout << "ResumableDownloadObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
0を返します。}