全部产品
Search
文档中心

Object Storage Service:Mengelola metadata objek (C SDK)

更新时间:Nov 30, 2025

Objek yang disimpan di Object Storage Service (OSS) terdiri dari kunci, data, dan metadata objek. Metadata objek menjelaskan properti objek tersebut dan mencakup header HTTP standar serta metadata yang ditentukan pengguna. Anda dapat mengatur header HTTP standar untuk menetapkan kebijakan permintaan HTTP kustom, seperti kebijakan cache objek dan unduhan paksa. Selain itu, Anda juga dapat mengatur metadata yang ditentukan pengguna untuk mengidentifikasi tujuan atau properti objek.

Catatan

  • Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.

  • Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Inisialisasi (C SDK).

  • Untuk mengatur metadata objek, Anda harus memiliki izin oss:PutObject. Untuk mengambil metadata objek, Anda harus memiliki izin oss:GetObject. Untuk informasi selengkapnya, lihat Lampirkan kebijakan kustom ke RAM user.

Kode contoh

Setelah mengunggah objek ke OSS atau sebelum membacanya, Anda dapat memanggil operasi oss_get_object_meta untuk mengambil metadata objek, seperti panjang dan jenisnya. Kode berikut menunjukkan contoh cara mengatur dan mengambil metadata objek:

Peringatan

Saat mengatur metadata selama pengunggahan objek, pastikan tidak ada objek lain dengan nama yang sama di bucket tersebut. Jika ada, objek yang sudah ada akan ditimpa. Untuk informasi selengkapnya tentang cara mencegah penimpaan objek dengan nama yang sama, lihat Cegah penimpaan objek dengan nama yang sama.

#include "oss_api.h"
#include "aos_http_io.h"
/* Tetapkan yourEndpoint ke Endpoint wilayah tempat bucket berada. Misalnya, untuk wilayah China (Hangzhou), tetapkan Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Misalnya, examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
const char *object_content= "hello world";
/* Tetapkan yourRegion ke wilayah tempat bucket berada. Misalnya, untuk wilayah China (Hangzhou), tetapkan wilayah ke cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* Inisialisasi tipe aos_string_t dengan string char*. */
    aos_str_set(&options->config->endpoint, endpoint);
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur. */
    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"));
    // Konfigurasikan dua parameter tambahan berikut.
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* Tentukan apakah CNAME digunakan. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
    options->config->is_cname = 0;
    /* Atur parameter jaringan, seperti periode timeout. */
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* Panggil metode aos_http_io_initialize di awal program untuk menginisialisasi sumber daya global seperti jaringan dan memori. */
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* Pool memori untuk manajemen memori setara dengan apr_pool_t. Kode implementasinya berada di pustaka apr. */
    aos_pool_t *pool;
    /* Buat pool memori baru. Parameter kedua adalah NULL, yang menunjukkan bahwa pool baru ini tidak mewarisi dari pool memori lain. */
    aos_pool_create(&pool, NULL);
    /* Buat dan inisialisasi opsi. Parameter ini berisi informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
    oss_request_options_t *oss_client_options;
    /* Alokasikan memori untuk opsi di dalam pool memori. */
    oss_client_options = oss_request_options_create(pool);
    /* Inisialisasi opsi klien oss_client_options. */
    init_options(oss_client_options);
    /* Inisialisasi parameter. */
    aos_string_t bucket;
    aos_string_t object;
    aos_table_t *headers;
    aos_list_t buffer;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_buf_t *content = NULL;
    char *content_length_str = NULL;
    char *object_type = NULL;
    char *object_author = NULL;
    int64_t content_length = 0;
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    headers = aos_table_make(pool, 2);
    /* Atur metadata yang ditentukan pengguna. */
    apr_table_set(headers, "Expires", "Fri, 28 Feb 2032 05:38:42 GMT"); 
    apr_table_set(headers, "x-oss-meta-author", "oss");
    aos_list_init(&buffer);
    content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
    aos_list_add_tail(&content->node, &buffer);
    /* Unggah objek dari 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 with md5 succeeded\n");
    } else {
        printf("put object from buffer with md5 failed\n");
    }
    /* Dapatkan metadata objek. */
    resp_status = oss_get_object_meta(oss_client_options, &bucket, &object, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        content_length_str = (char*)apr_table_get(resp_headers, OSS_CONTENT_LENGTH);
        if (content_length_str != NULL) {
            content_length = atol(content_length_str);
        }
        object_author = (char*)apr_table_get(resp_headers, OSS_AUTHORIZATION);
        object_type = (char*)apr_table_get(resp_headers, OSS_OBJECT_TYPE);
        printf("get object meta succeeded, object author:%s, object type:%s, content_length:%ld\n", object_author, object_type, content_length);
    } else {
        printf("req:%s, get object meta failed\n", resp_status->req_id);
    }
    /* Hancurkan pool memori. Ini akan melepaskan memori yang dialokasikan untuk sumber daya selama permintaan. */
    aos_pool_destroy(pool);
    /* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
    aos_http_io_deinitialize();
    return 0;
}

Referensi

  • Untuk kode contoh lengkap yang menunjukkan cara mengambil metadata objek, lihat GitHub.

  • Untuk informasi selengkapnya mengenai operasi API yang digunakan untuk mengambil metadata objek, lihat GetObjectMeta.