Unggah yang dapat dilanjutkan membagi file menjadi beberapa bagian yang diunggah secara terpisah. Setelah semua bagian diunggah, bagian-bagian tersebut digabung menjadi satu file untuk menyelesaikan proses unggah.
Informasi latar belakang
Selama proses unggah, kemajuan dicatat dalam file checkpoint. Jika pengunggahan suatu bagian gagal, proses unggah dilanjutkan dari titik yang tercatat dalam file checkpoint tersebut. File checkpoint akan dihapus setelah unggah selesai.
Anda dapat mengimplementasikan unggah yang dapat dilanjutkan menggunakan oss_resumable_clt_params_t. Parameter umum untuk metode ini dijelaskan dalam tabel berikut.
Parameter | Description |
thread_num | Jumlah thread konkuren. Nilai default adalah 1. |
enable_checkpoint | Menentukan apakah fitur unggah yang dapat dilanjutkan diaktifkan. Secara default, fitur ini dinonaktifkan. |
partSize | Ukuran setiap bagian untuk unggah multi-bagian. Nilainya harus berada dalam rentang 100 KB hingga 5 GB. |
checkpoint_path | Jalur file checkpoint. Jalur default adalah {upload_file_path}.cp. |
Catatan penggunaan
Pada topik ini, digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya yang berada di 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 melakukan unggah yang dapat dilanjutkan, Anda harus memiliki izin
oss:PutObject. Untuk informasi selengkapnya, lihat Lampirkan kebijakan kustom ke RAM user.
Kode contoh
Kode berikut menunjukkan cara melakukan unggah yang dapat dilanjutkan:
#include "oss_api.h"
#include "aos_http_io.h"
/* Tetapkan yourEndpoint ke Endpoint wilayah bucket. 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 jalur lengkap objek. Jalur lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan jalur lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
/* Tetapkan yourRegion ke Wilayah bucket. 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 ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah ditetapkan. */
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"));
// Anda juga harus mengonfigurasi dua parameter berikut.
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* Menentukan apakah CNAME digunakan. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Tetapkan parameter jaringan, seperti periode timeout. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Pada titik masuk program, panggil metode aos_http_io_initialize 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. Ini setara dengan apr_pool_t. Implementasinya ada 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 mencakup 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 bucket;
aos_string_t object;
aos_string_t file;
aos_list_t resp_body;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
oss_resumable_clt_params_t *clt_params;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
aos_list_init(&resp_body);
/* Lakukan unggah yang dapat dilanjutkan. */
clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
resp_status = oss_resumable_upload_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers, &resp_body);
if (aos_status_is_ok(resp_status)) {
printf("resumable upload succeeded\n");
} else {
printf("resumable upload failed\n");
}
/* 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 mengenai unggah yang dapat dilanjutkan, lihat GitHub.