Topik ini menjelaskan cara menyalin file (objek) dari bucket sumber ke bucket yang sama atau ke bucket berbeda dalam wilayah yang sama.
Catatan penggunaan
-
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 Regions and endpoints.
-
Topik ini menunjukkan cara membuat instans OSSClient dengan titik akhir OSS. Untuk konfigurasi alternatif, seperti menggunakan domain kustom atau melakukan autentikasi dengan kredensial dari Security Token Service (STS), lihat Initialization (C SDK).
-
Gunakan CopyObject atau UploadPartCopy untuk menyalin file. Operasi yang digunakan tergantung pada ukuran file. Untuk informasi selengkapnya mengenai batas ukuran file saat menyalin, lihat CopyObject.
Menyalin file menggunakan CopyObject
-
Anda harus memiliki izin baca untuk file sumber dan izin baca/tulis untuk bucket tujuan.
-
Salinan lintas-wilayah tidak didukung. Misalnya, Anda tidak dapat menyalin file dari bucket di wilayah China (Hangzhou) ke bucket di wilayah China (Qingdao).
Kode berikut menunjukkan cara menyalin file menggunakan CopyObject:
#include "oss_api.h"
#include "aos_http_io.h"
/* Setel yourEndpoint ke Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket sumber. */
const char *source_bucket_name = "yourSourceBucketName";
/* Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. */
const char *source_object_name = "yourSourceObjectName";
/* Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber. */
const char *dest_bucket_name = "yourDestBucketName";
/* Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. */
const char *dest_object_name = "yourDestObjectName";
/* Setel yourRegion ke ID Wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel ID 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 disetel. */
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;
/* Menentukan apakah CNAME digunakan. 0 berarti CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Setel 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 (pool) untuk manajemen memori setara dengan apr_pool_t. Kode implementasinya ada di pustaka APR. */
aos_pool_t *pool;
/* Buat pool memori. Parameter kedua adalah NULL, yang berarti pool memori baru tidak mewarisi dari pool memori lain. */
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 memori untuk opsi 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 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 file tersebut. */
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("copy object succeeded\n");
} else {
printf("copy object failed\n");
}
/* Hapus 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;
}
Menyalin file menggunakan UploadPartCopy
Kode berikut menunjukkan cara menyalin file secara bertahap menggunakan UploadPartCopy:
#include "oss_api.h"
#include "aos_http_io.h"
#include <sys/stat.h>
/* Setel yourEndpoint ke Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket sumber. */
const char *source_bucket_name = "yourSourceBucketName";
/* Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. */
const char *source_object_name = "yourSourceObjectName";
/* Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber. */
const char *dest_bucket_name = "yourDestBucketName";
/* Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. */
const char *dest_object_name = "yourDestObjectName";
/* Setel yourRegion ke ID Wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel ID 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 disetel. */
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;
/* Menentukan apakah CNAME digunakan. 0 berarti CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Setel 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 (pool) untuk manajemen memori setara dengan apr_pool_t. Kode implementasinya ada di pustaka APR. */
aos_pool_t* pool;
/* Buat pool memori. Parameter kedua adalah NULL, yang berarti pool memori baru tidak mewarisi dari pool memori lain. */
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 memori untuk opsi 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 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 succeeded\n");
}
else {
printf("head object failed\n");
}
/* Inisialisasi unggah 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("init multipart upload succeeded, upload_id is %s\n", upload_id.data);
}
else {
printf("init multipart upload failed\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("upload part 1 copy succeeded\n");
}
else {
printf("upload part 1 copy failed\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("upload part 2 copy succeeded\n");
}
else {
printf("upload part 2 copy failed\n");
}
/* Daftar bagian-bagian tersebut. */
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 salinan 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("complete multipart upload succeeded\n");
}
else {
printf("complete multipart upload failed\n");
}
/* Hapus 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
-
Menyalin file kecil
Untuk informasi selengkapnya mengenai operasi API untuk menyalin file kecil, lihat CopyObject.
-
Menyalin file besar
Untuk informasi selengkapnya mengenai operasi API untuk menyalin file besar, lihat UploadPartCopy.