全部产品
Search
文档中心

Object Storage Service:Menyalin objek menggunakan OSS SDK untuk C

更新时间:Aug 06, 2025

Topik ini menjelaskan cara menyalin objek dalam satu bucket atau di antara bucket yang berada di wilayah yang sama.

Catatan penggunaan

  • Dalam topik ini, titik akhir publik Wilayah China (Hangzhou) digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.

  • Dalam topik ini, instans OSSClient dibuat dengan menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient dengan menggunakan nama domain kustom atau Layanan Token Keamanan (STS), lihat Inisialisasi.

  • Anda dapat memanggil operasi CopyObject atau UploadPartCopy untuk menyalin objek berdasarkan ukuran objek. Untuk informasi lebih lanjut tentang batas ukuran objek, lihat CopyObject.

Mengunggah objek kecil

Catatan
  • Untuk menyalin objek, Anda harus memiliki izin baca pada objek sumber dan izin baca serta tulis pada bucket tujuan.

  • Bucket sumber dan bucket tujuan harus berada di wilayah yang sama. Sebagai contoh, objek tidak dapat disalin dari bucket yang berlokasi di Wilayah China (Hangzhou) ke bucket lain yang berlokasi di Wilayah China (Qingdao).

Kode berikut memberikan contoh cara menyalin objek kecil dengan memanggil operasi CopyObject:

#include "oss_api.h"
#include "aos_http_io.h"
/* Tentukan titik akhir wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket sumber. */
const char *source_bucket_name = "yourSourceBucketName";
/* Tentukan jalur lengkap objek sumber. Jangan masukkan nama bucket dalam jalur lengkap. */
const char *source_object_name = "yourSourceObjectName";
/* Tentukan nama bucket tujuan. Bucket tujuan harus berada di wilayah yang sama dengan bucket sumber. */
const char *dest_bucket_name = "yourDestBucketName";
/* Tentukan jalur lengkap objek tujuan. Jangan masukkan nama bucket dalam jalur lengkap. */
const char *dest_object_name = "yourDestObjectName";
/* Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* Gunakan string char* untuk menginisialisasi data bertipe aos_string_t. */
    aos_str_set(&options->config->endpoint, endpoint);
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
    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"));
    // Tentukan dua parameter tambahan.
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* Tentukan apakah akan menggunakan CNAME. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
    options->config->is_cname = 0;
    /* Tentukan 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 main() untuk menginisialisasi sumber daya global, seperti sumber daya jaringan dan memori. */
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* Buat kolam memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode untuk membuat kolam memori termasuk dalam pustaka APR. */
    aos_pool_t *pool;
    /* Buat kolam memori. Nilai parameter kedua adalah NULL. Nilai ini menunjukkan bahwa kolam tidak mewarisi kolam memori lainnya. */
    aos_pool_create(&pool, NULL);
    /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
    oss_request_options_t *oss_client_options;
    /* Alokasikan sumber daya memori di kolam memori untuk opsi. */
    oss_client_options = oss_request_options_create(pool);
    /* Inisialisasi oss_client_options. */
    init_options(oss_client_options);
    /* Inisialisasi parameter. */
    aos_string_t source_bucket;
    aos_string_t source_object;
    aos_string_t dest_bucket;
    aos_string_t dest_object;
    aos_table_t *headers = NULL;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_str_set(&source_bucket, source_bucket_name);
    aos_str_set(&source_object, source_object_name);
    aos_str_set(&dest_bucket, dest_bucket_name);
    aos_str_set(&dest_object, dest_object_name);
    headers = aos_table_make(pool, 0);
    /* Salin objek. */
    resp_status = oss_copy_object(oss_client_options, &source_bucket, &source_object, &dest_bucket, &dest_object, headers, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("menyalin objek berhasil\n");
    } else {
        printf("menyalin objek gagal\n");
    }
    /* Lepaskan kolam memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
    aos_pool_destroy(pool);
    /* Lepaskan sumber daya global yang dialokasikan. */
    aos_http_io_deinitialize();
    return 0;
}

Menyalin objek besar

Kode berikut memberikan contoh cara melakukan penyalinan multi-bagian dengan memanggil operasi UploadPartCopy:

#include "oss_api.h"
#include "aos_http_io.h"
#include <sys/stat.h>
/* Tentukan titik akhir wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket sumber. */
const char *source_bucket_name = "yourSourceBucketName";
/* Tentukan jalur lengkap objek sumber. Jangan masukkan nama bucket dalam jalur lengkap. */
const char *source_object_name = "yourSourceObjectName";
/* Tentukan nama bucket tujuan. Bucket tujuan harus berada di wilayah yang sama dengan bucket sumber. */
const char *dest_bucket_name = "yourDestBucketName";
/* Tentukan jalur lengkap objek tujuan. Jangan masukkan nama bucket dalam jalur lengkap. */
const char *dest_object_name = "yourDestObjectName";
/* Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t* options)
 {
     options->config = oss_config_create(options->pool);
     /* Gunakan string char* untuk menginisialisasi data bertipe aos_string_t. */
     aos_str_set(&options->config->endpoint, endpoint);
     /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
     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"));
     // Tentukan dua parameter tambahan.
     aos_str_set(&options->config->region, region);
     options->config->signature_version = 4;
     /* Tentukan apakah akan menggunakan CNAME. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
     options->config->is_cname = 0;
     /* Tentukan 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 main() untuk menginisialisasi sumber daya global, seperti sumber daya jaringan dan memori. */
     if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
         exit(1);
     }
     /* Buat kolam memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode untuk membuat kolam memori termasuk dalam pustaka APR. */
     aos_pool_t* pool;
     /* Buat kolam memori. Nilai parameter kedua adalah NULL. Nilai ini menunjukkan bahwa kolam tidak mewarisi kolam memori lainnya. */
     aos_pool_create(&pool, NULL);
     /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
     oss_request_options_t* oss_client_options;
     /* Alokasikan sumber daya memori di kolam memori untuk opsi. */
     oss_client_options = oss_request_options_create(pool);
     /* Inisialisasi oss_client_options. */
     init_options(oss_client_options);
     /* Inisialisasi parameter. */
     aos_string_t src_bucket;
     aos_string_t src_object;
     aos_string_t dest_bucket;
     aos_string_t dest_object;
     aos_string_t upload_id;
     aos_table_t* headers = NULL;
     aos_table_t* resp_headers = NULL;
     aos_status_t* resp_status = NULL;
     oss_list_upload_part_params_t* list_upload_part_params;
     oss_upload_part_copy_params_t* upload_part_copy_params1;
     oss_upload_part_copy_params_t* upload_part_copy_params2;
     oss_list_part_content_t* part_content;
     aos_list_t complete_part_list;
     oss_complete_part_content_t* complete_content;
     aos_table_t* list_part_resp_headers = NULL;
     aos_table_t* complete_resp_headers = NULL;
     int part1 = 1;
     int part2 = 2;
     int64_t range_start1 = 0;
     int64_t range_end1 = 6000000;//tidak kurang dari 5MB
     int64_t range_start2 = 6000001;
     int64_t range_end2;
     int max_ret = 1000;
     int64_t content_length = 0;
     /* Dapatkan ukuran objek sumber. */
     headers = aos_table_make(pool, 0);
     aos_str_set(&src_bucket, source_bucket_name);
     aos_str_set(&src_object, source_object_name);
     resp_status = oss_head_object(oss_client_options, &src_bucket, &src_object, headers, &resp_headers);
     if (aos_status_is_ok(resp_status)) {
         char *content_length_str = (char*)apr_table_get(resp_headers, OSS_CONTENT_LENGTH);
         if (content_length_str != NULL) {
             content_length = atoll(content_length_str);
         }
         printf("head object berhasil\n");
     }
     else {
         printf("head object gagal\n");
     }
     /*  Mulai tugas penyalinan multi-bagian. */
     headers = aos_table_make(pool, 0);
     aos_str_set(&dest_bucket, dest_bucket_name);
     aos_str_set(&dest_object, dest_object_name);
     resp_status = oss_init_multipart_upload(oss_client_options, &dest_bucket, &dest_object, &upload_id, headers, &resp_headers);
     if (aos_status_is_ok(resp_status)) {
         printf("inisiasi unggah multi-bagian berhasil, upload_id adalah %s\n", upload_id.data);
     }
     else {
         printf("inisiasi unggah multi-bagian gagal\n");
     }
     /* Salin bagian pertama. */
     upload_part_copy_params1 = oss_create_upload_part_copy_params(pool);
     aos_str_set(&upload_part_copy_params1->source_bucket, source_bucket_name);
     aos_str_set(&upload_part_copy_params1->source_object, source_object_name);
     aos_str_set(&upload_part_copy_params1->dest_bucket, dest_bucket_name);
     aos_str_set(&upload_part_copy_params1->dest_object, dest_object_name);
     aos_str_set(&upload_part_copy_params1->upload_id, upload_id.data);
     upload_part_copy_params1->part_num = part1;
     upload_part_copy_params1->range_start = range_start1;
     upload_part_copy_params1->range_end = range_end1;
     headers = aos_table_make(pool, 0);
     resp_status = oss_upload_part_copy(oss_client_options, upload_part_copy_params1, headers, &resp_headers);
     if (aos_status_is_ok(resp_status)) {
         printf("unggah bagian 1 salinan berhasil\n");
     }
     else {
         printf("unggah bagian 1 salinan gagal\n");
     }
     /* Salin bagian kedua. */
     range_end2 = content_length - 1;
     upload_part_copy_params2 = oss_create_upload_part_copy_params(pool);
     aos_str_set(&upload_part_copy_params2->source_bucket, source_bucket_name);
     aos_str_set(&upload_part_copy_params2->source_object, source_object_name);
     aos_str_set(&upload_part_copy_params2->dest_bucket, dest_bucket_name);
     aos_str_set(&upload_part_copy_params2->dest_object, dest_object_name);
     aos_str_set(&upload_part_copy_params2->upload_id, upload_id.data);
     upload_part_copy_params2->part_num = part2;
     upload_part_copy_params2->range_start = range_start2;
     upload_part_copy_params2->range_end = range_end2;
     headers = aos_table_make(pool, 0);
     resp_status = oss_upload_part_copy(oss_client_options, upload_part_copy_params2, headers, &resp_headers);
     if (aos_status_is_ok(resp_status)) {
         printf("unggah bagian 2 salinan berhasil\n");
     }
     else {
         printf("unggah bagian 2 salinan gagal\n");
     }
     /* Daftar bagian yang disalin. */
     headers = aos_table_make(pool, 0);
     list_upload_part_params = oss_create_list_upload_part_params(pool);
     list_upload_part_params->max_ret = max_ret;
     aos_list_init(&complete_part_list);
     resp_status = oss_list_upload_part(oss_client_options, &dest_bucket, &dest_object, &upload_id, list_upload_part_params, &list_part_resp_headers);
     aos_list_for_each_entry(oss_list_part_content_t, part_content, &list_upload_part_params->part_list, node) {
         complete_content = oss_create_complete_part_content(pool);
         aos_str_set(&complete_content->part_number, part_content->part_number.data);
         aos_str_set(&complete_content->etag, part_content->etag.data);
         aos_list_add_tail(&complete_content->node, &complete_part_list);
     }
     /* Selesaikan tugas penyalinan multi-bagian. */
     resp_status = oss_complete_multipart_upload(oss_client_options, &dest_bucket, &dest_object, &upload_id, &complete_part_list, headers, &complete_resp_headers);
     if (aos_status_is_ok(resp_status)) {
         printf("penyelesaian unggah multi-bagian berhasil\n");
     }
     else {
         printf("penyelesaian unggah multi-bagian gagal\n");
     }
     /* Lepaskan kolam memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
     aos_pool_destroy(pool);
     /* Lepaskan sumber daya global yang dialokasikan. */
     aos_http_io_deinitialize();
     return 0;
 }

Referensi

  • Menyalin Objek Kecil

    Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyalin objek kecil, lihat CopyObject.

  • Menyalin Objek Besar

    Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyalin objek besar, lihat UploadPartCopy.