Mengunduh file besar dapat gagal akibat jaringan yang tidak stabil atau pengecualian program. Bahkan setelah beberapa kali mencoba ulang, pengunduhan terkadang tetap gagal. Untuk mengatasi masalah ini, Object Storage Service (OSS) menyediakan fitur unduhan yang dapat dilanjutkan, yang membagi file menjadi beberapa bagian, mengunduh tiap bagian secara terpisah, lalu menggabungkannya kembali menjadi file lengkap.
Catatan penggunaan
Topik ini menggunakan 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.
Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Buat instans OssClient.
Untuk melakukan unduhan yang dapat dilanjutkan, Anda harus memiliki izin
oss:GetObject. Untuk informasi selengkapnya, lihat Lampirkan kebijakan kustom ke RAM user.
Metode implementasi
Anda dapat menggunakan metode OssClient.ResumableDownloadObject untuk melakukan unduhan yang dapat dilanjutkan. Parameter DownloadObjectRequest untuk metode ini mencakup hal-hal berikut:
Parameter | Deskripsi | Wajib | Nilai default | Cara mengatur |
bucket | Nama bucket. | Ya | Tidak ada | Diatur dalam konstruktor. |
key | Jalur lengkap file OSS. | Ya | Tidak ada | Diatur dalam konstruktor. |
filePath | Jalur lengkap file lokal. | Tidak | Nama file OSS | Diatur dalam konstruktor. |
partSize | Ukuran shard. Nilainya harus antara 100 KB hingga 5 GB. | Tidak | 8 MB | Diatur menggunakan setPartSize. |
threadNum | Jumlah unduhan shard konkuren. | Tidak | 3 | Diatur dalam konstruktor atau menggunakan setThreadNum. |
checkpointDir | File yang mencatat hasil unduhan shard lokal. Atur parameter ini untuk mengaktifkan fitur unduhan yang dapat dilanjutkan. Informasi progres disimpan ke file ini selama pengunduhan. Jika pengunduhan suatu shard gagal, percobaan unduhan berikutnya akan dilanjutkan dari titik yang tercatat dalam file tersebut. Setelah pengunduhan selesai, file ini dihapus. | Tidak | Folder yang sama dengan file unduhan. | Diatur dalam konstruktor atau menggunakan setCheckpointDir. |
Contoh kode
Kode berikut menunjukkan cara melakukan unduhan yang dapat dilanjutkan:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun OSS. */
/* Tetapkan yourEndpoint ke Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tetapkan yourRegion ke ID Wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan ID Wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket, misalnya examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan jalur lengkap objek. Jalur lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Unduh objek ke file lokal bernama examplefile.txt dan simpan ke jalur lokal yang ditentukan (D:\\localpath). Jika file lokal sudah ada, file tersebut akan ditimpa. Jika belum ada, file tersebut akan dibuat. */
/* Jika Anda tidak menentukan jalur lokal, file yang diunduh akan disimpan ke jalur lokal proyek secara default. */
std::string DownloadFilePath = "D:\\localpath\\examplefile.txt";
/* Tetapkan folder untuk file catatan checkpoint dan pastikan folder yang ditentukan sudah ada, misalnya D:\\localpath. */
/* Jika pengunduhan objek terganggu dan file catatan checkpoint dihasilkan, Anda harus menetapkan file catatan checkpoint yang sesuai untuk melanjutkan pengunduhan. Setelah pengunduhan selesai, file ini dihapus. */
std::string CheckpointFilePath = "D:\\localpath";
/* Inisialisasi sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Lakukan unduhan yang dapat dilanjutkan. */
DownloadObjectRequest request(BucketName, ObjectName, DownloadFilePath, CheckpointFilePath);
auto outcome = client.ResumableDownloadObject(request);
if (!outcome.isSuccess()) {
/* Tangani pengecualian. */
std::cout << "ResumableDownloadObject gagal" <<
",kode:" << outcome.error().Code() <<
",pesan:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya jaringan. */
ShutdownSdk();
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.