このトピックでは、OSS オブジェクトをメモリにダウンロードする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化 (C SDK)」をご参照ください。
権限
デフォルトでは、Alibaba Cloud アカウントはすべての権限を持っています。Alibaba Cloud アカウント下の Resource Access Management (RAM) ユーザーまたは RAM ロールには、デフォルトでは権限がありません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 定義 |
GetObject |
| オブジェクトをダウンロードします。 |
| オブジェクトをダウンロードする際に、versionId を通じてオブジェクトのバージョンを指定する場合、この権限が必要です。 | |
| オブジェクトをダウンロードする際に、オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、この権限が必要です。 |
サンプルコード
次のコードは、指定された OSS オブジェクトをメモリにダウンロードする方法を示しています。
#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";
/* yourRegion を、バケットが配置されているリージョンに設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。 */
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);
}
/* メモリ管理用のメモリプールは 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_list_t buffer;
aos_buf_t *content = NULL;
aos_table_t *params = NULL;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
char *buf = NULL;
int64_t len = 0;
int64_t size = 0;
int64_t pos = 0;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_list_init(&buffer);
/* オブジェクトをメモリにダウンロードします。 */
resp_status = oss_get_object_to_buffer(oss_client_options, &bucket, &object,
headers, params, &buffer, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("オブジェクトのバッファーへの取得に成功しました\n");
/* ダウンロードしたコンテンツをバッファーにコピーします。 */
len = aos_buf_list_len(&buffer);
buf = aos_pcalloc(pool, len + 1);
buf[len] = '\0';
aos_list_for_each_entry(aos_buf_t, content, &buffer, node) {
size = aos_buf_size(content);
memcpy(buf + pos, content->pos, size);
pos += size;
}
}
else {
printf("オブジェクトのバッファーへの取得に失敗しました\n");
}
/* メモリプールを解放します。 これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}関連ドキュメント
オブジェクトをメモリにダウンロードするための完全なサンプルコードについては、「GitHub example」をご参照ください。
オブジェクトをメモリにダウンロードするための API リファレンスについては、「GetObject」をご参照ください。