全部产品
Search
文档中心

Object Storage Service:Unduhan yang dapat dilanjutkan (C SDK)

更新时间:Nov 30, 2025

Mengunduh file besar dapat gagal akibat ketidakstabilan jaringan atau pengecualian lainnya, sehingga unduhan mungkin tidak selesai meskipun telah dicoba berulang kali. OSS menyediakan fitur unduhan yang dapat dilanjutkan untuk mengatasi masalah ini.

Catatan

  • Pada topik ini digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lain 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.

  • Contoh pada topik ini menunjukkan cara membuat instans OSSClient menggunakan nama domain OSS. Untuk membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Inisialisasi (C SDK).

    Catatan

    Untuk melakukan unduhan yang dapat dilanjutkan menggunakan STS, pastikan Anda menggunakan C SDK V3.5.2 atau versi yang lebih baru.

  • Untuk melakukan unduhan yang dapat dilanjutkan, Anda harus memiliki izin oss:GetObject. Untuk informasi selengkapnya, lihat Lampirkan kebijakan kustom ke RAM user.

Kode contoh

Anda dapat menggunakan metode oss_resumable_clt_params_t untuk melakukan (unduhan yang dapat dilanjutkan). Metode oss_resumable_clt_params_t mencakup parameter berikut:

Parameter

Deskripsi

thread_num

Jumlah thread konkuren. Nilai default adalah 1.

enable_checkpoint

Menentukan apakah fitur unduhan yang dapat dilanjutkan diaktifkan. Secara default, fitur ini dinonaktifkan.

partSize

Ukuran bagian. Nilainya harus antara 1 B hingga 5 GB. Satuan dalam byte.

checkpoint_path

Jalur menuju file checkpoint. Jalur default adalah folder `{upload_file_path}.cp`.

Selama proses unduhan, informasi progres direkam dalam file checkpoint. Jika unduhan gagal, percobaan berikutnya akan membaca file checkpoint untuk melanjutkan unduhan. Setelah unduhan selesai, file checkpoint akan dihapus.

Kode berikut menunjukkan cara melakukan unduhan yang dapat dilanjutkan.

#include "oss_api.h"
#include "aos_http_io.h"
/* Ganti yourEndpoint dengan Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";

/* Ganti dengan nama bucket Anda, 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";
/* Tentukan path lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
/* Ganti yourRegion dengan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region menjadi 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"));
    // Anda juga harus mengonfigurasi dua parameter 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 (pool) untuk manajemen memori, yang 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 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 client oss_client_options. */
    init_options(oss_client_options);
    /* Inisialisasi parameter. */
    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; 
    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);
    /* Lakukan unduhan yang dapat dilanjutkan. */
    clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
    resp_status = oss_resumable_download_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("download succeeded\n");
    } else {
        printf("download failed\n");
    }
    /* Hapus pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai 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 unduhan yang dapat dilanjutkan, lihat contoh di GitHub.

  • Untuk informasi selengkapnya mengenai operasi API untuk unduhan yang dapat dilanjutkan, lihat GetObject.