ネットワークが不安定な場合やその他の例外が発生した場合、大きなオブジェクトのダウンロードに失敗することがあります。 場合によっては、複数回試行してもオブジェクトのダウンロードに失敗することがあります。 この問題を解決するために、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>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize information about the account that is used to access OSS. */
/* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Specify the name of the bucket. Example: examplebucket. */
std::string BucketName = "examplebucket";
/* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Download the object to the local path D:\\localpath as a local file named examplefile.txt. If a file that has the same name already exists in the specified path, the downloaded object overwrites the file. Otherwise, the downloaded object is saved in the path. */
/* If you do not specify the path of the local file, the downloaded object is saved to the path of the project to which the sample program belongs. */
std::string DownloadFilePath = "D:\\localpath\\examplefile.txt";
/* Specify the directory where the checkpoint file is stored and make sure that the specified directory exists, such as D:\\localpath. */
/* The checkpoint file is generated when the download is interrupted. If you want to resume the download task, you must specify the full path of the checkpoint file. After the object is downloaded, the checkpoint file is deleted. */
std::string CheckpointFilePath = "D:\\localpath";
/* Initialize resources such as network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Start resumable download. */
DownloadObjectRequest request(BucketName, ObjectName, DownloadFilePath, CheckpointFilePath);
auto outcome = client.ResumableDownloadObject(request);
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "ResumableDownloadObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release resources such as network resources. */
ShutdownSdk();
return 0;
}