サイズの大きいファイルのダウンロードは、ネットワークが不安定な場合やその他の例外により失敗することがあります。このような場合、数回リトライしてもダウンロードが完了しない可能性があります。OSS はこの問題に対処するため、再開可能なダウンロード機能を提供しています。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックの例では、OSS ドメイン名を使用して OSSClient インスタンスを作成する方法を示しています。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する方法については、「初期化 (C SDK)」をご参照ください。
説明STS を使用して再開可能なダウンロードを実行するには、C SDK V3.5.2 以降を使用する必要があります。
再開可能なダウンロードを実行するには、
oss:GetObject権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
サンプルコード
oss_resumable_clt_params_t メソッドを使用して、再開可能なダウンロードを実行できます。oss_resumable_clt_params_t メソッドには、次のパラメーターが含まれています。
パラメーター | 説明 |
thread_num | 同時実行スレッド数。デフォルト値は 1 です。 |
enable_checkpoint | 再開可能なダウンロードを有効にするかどうかを指定します。デフォルトでは、この機能は無効になっています。 |
partSize | パートサイズ。値は 1 B から 5 GB の範囲でなければなりません。単位はバイトです。 |
checkpoint_path | チェックポイントファイルのパス。デフォルトのパスは `{upload_file_path}.cp` フォルダです。 |
ダウンロード中、進行状況の情報は checkpoint ファイルに記録されます。ダウンロードが失敗した場合、次回の試行では checkpoint ファイルを読み取ってダウンロードを再開します。ダウンロードが完了すると、checkpoint ファイルは削除されます。
次のコードは、再開可能なダウンロードを実行する方法を示しています。
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに置き換えます。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
const char *endpoint = "yourEndpoint";
/* バケット名に置き換えます (例: examplebucket)。*/
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
/* ローカルファイルの完全なパスを指定します。*/
const char *local_filename = "yourLocalFilename";
/* yourRegion を、バケットが配置されているリージョンに置き換えます。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* char* 文字列で aos_string_t 型を初期化します。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// 次の 2 つのパラメーターも設定する必要があります。
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* CNAME ドメイン名を使用するかどうかを指定します。値 0 は、CNAME ドメイン名が使用されないことを示します。*/
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムのエントリで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリ管理用のメモリプール (pool)。apr_pool_t と同等です。実装コードは apr ライブラリにあります。*/
aos_pool_t *pool;
/* 新しいメモリプールを作成します。2 番目のパラメーターは NULL で、新しいプールが別のメモリプールから継承しないことを示します。*/
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバルな構成情報が含まれます。*/
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。*/
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。*/
init_options(oss_client_options);
/* パラメーターを初期化します。*/
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
oss_resumable_clt_params_t *clt_params;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
/* 再開可能なダウンロードを実行します。*/
clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
resp_status = oss_resumable_download_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("download succeeded\n");
} else {
printf("download failed\n");
}
/* メモリプールを解放します。これは、リクエスト中にさまざまなリソースに割り当てられたメモリを解放することと同じです。*/
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。*/
aos_http_io_deinitialize();
return 0;
}関連リファレンス
再開可能なダウンロードの完全なサンプルコードについては、「GitHub サンプル」をご参照ください。
再開可能なダウンロードの API 操作の詳細については、「GetObject」をご参照ください。