このトピックでは、シンプルアップロードを実行する方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 Object Storage Service (OSS) と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。 OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。 カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化 (C SDK)」をご参照ください。
権限
デフォルトでは、Alibaba Cloud アカウントはすべての権限を持ちます。 Alibaba Cloud アカウント下の Resource Access Management (RAM) ユーザーまたは RAM ロールは、デフォルトでは何の権限も持っていません。 Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 説明 |
PutObject |
| オブジェクトをアップロードします。 |
| オブジェクトのアップロード時に | |
| オブジェクトのアップロード時に、オブジェクトのメタデータに | |
|
メモリからのデータアップロード
次のコードは、メモリからデータをアップロードする方法を示しています。
#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 *object_content = "More than just cloud.";
/* yourRegion を、バケットが配置されているリージョンのリージョン ID に設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョン ID を 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 *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_list_init(&buffer);
content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
aos_list_add_tail(&content->node, &buffer);
/* ファイルをアップロードします。 */
resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers);
/* アップロードが成功したかどうかを確認します。 */
if (aos_status_is_ok(resp_status)) {
printf("put object from buffer succeeded\n");
} else {
printf("put object from buffer failed\n");
}
/* メモリプールを解放します。 これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}ローカルファイルのアップロード
次のコードは、ローカルファイルをアップロードする方法を示しています。
#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 を、バケットが配置されているリージョンのリージョン ID に設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョン ID を 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_string_t file;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
/* ファイルをアップロードします。 */
resp_status = oss_put_object_from_file(oss_client_options, &bucket, &object, &file, headers, &resp_headers);
/* アップロードが成功したかどうかを確認します。 */
if (aos_status_is_ok(resp_status)) {
printf("put object from file succeeded\n");
} else {
printf("put object from file failed\n");
}
/* メモリプールを解放します。 これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}よくある質問:中国語文字を含む名前のファイルをアップロードできない
Linux の場合
Linux システムから中国語文字を含む名前のファイルをアップロードするには、ローカルファイルを OSS にアップロードするのと同じ手順に従います。 詳細については、「ローカルファイルのアップロード」をご参照ください。
Windows の場合
Windows システムから中国語文字を含む名前のファイルをアップロードするには、ファイル名を UTF-8 でエンコードする必要があります。 次のコードに例を示します。
#include "oss_api.h"
#include "aos_http_io.h"
#include <wchar.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_ch = "yourLocalFilename";
/* yourRegion を、バケットが配置されているリージョンのリージョン ID に設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョン ID を 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);
}
char* multibyte_to_utf8(const char * ch, char *str, int size)
{
if (!ch || !str || size <= 0)
return NULL;
int chlen = strlen(ch);
int multi_byte_cnt = 0;
for (int i = 0; i < chlen - 1; i++) {
if ((ch[i] & 0x80) && (ch[i + 1] & 0x80)) {
i++;
multi_byte_cnt++;
}
}
if (multi_byte_cnt == 0)
return ch;
int len = MultiByteToWideChar(CP_ACP, 0, ch, -1, NULL, 0);
if (len <= 0)
return NULL;
wchar_t *wch = malloc(sizeof(wchar_t) * (len + 1));
if (!wch)
return NULL;
wmemset(wch, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, ch, -1, wch, len);
len = WideCharToMultiByte(CP_UTF8, 0, wch, -1, NULL, 0, NULL, NULL);
if ((len <= 0) || (size < len + 1)) {
free(wch);
return NULL;
}
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wch, -1, str, len, NULL, NULL);
free(wch);
return str;
}
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_string_t file;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
/* マルチバイトの中国語名を UTF-8 でエンコードします。 */
char local_filename_buf[1024];
char * local_filename = multibyte_to_utf8(local_filename_ch, local_filename_buf, 1024);
aos_str_set(&file, local_filename);
/* ファイルをアップロードします。 */
resp_status = oss_put_object_from_file(oss_client_options, &bucket, &object, &file, headers, &resp_headers);
/* アップロードが成功したかどうかを確認します。 */
if (aos_status_is_ok(resp_status)) {
printf("put object from file succeeded\n");
} else {
printf("put object from file failed\n");
}
/* メモリプールを解放します。 これにより、リクエスト中にリソースに割り当てられたメモリが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}