Topik ini menjelaskan cara menyalin objek dalam satu bucket atau antar-bucket di wilayah yang sama.
Catatan penggunaan
Pada topik ini, titik akhir publik wilayah China (Hangzhou) digunakan. Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya 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 menyalin objek, Anda harus memiliki izin baca pada objek sumber serta izin baca dan tulis pada bucket tujuan.
Pastikan tidak ada kebijakan retensi yang dikonfigurasi untuk bucket sumber maupun bucket tujuan. Jika tidak, pesan error The object you specified is immutable. akan dikembalikan.
Bucket sumber dan bucket tujuan harus berada di wilayah yang sama. Misalnya, objek dalam bucket yang berlokasi di wilayah China (Hangzhou) tidak dapat disalin ke bucket lain yang berlokasi di wilayah China (Qingdao).
Salin objek kecil
Anda dapat memanggil client.CopyObject untuk menyalin objek berukuran kurang dari 1 GB dari bucket sumber ke bucket tujuan dalam wilayah yang sama. Tabel berikut menjelaskan cara mengonfigurasi parameter saat memanggil client.CopyObject.
Metode konfigurasi | Deskripsi |
CopyObjectOutcome OssClient::CopyObject(const CopyObjectRequest &request) | Memungkinkan Anda menentukan metadata objek tujuan dan kondisi penyalinan. Jika URL objek sumber dan objek tujuan sama, metadata yang ditentukan dalam permintaan akan menggantikan metadata objek sumber. |
Kode berikut memberikan contoh cara menyalin objek kecil:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun yang digunakan untuk mengakses OSS. */
/* Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket sumber. Contoh: srcexamplebucket. */
std::string SourceBucketName = "srcexamplebucket";
/* Tentukan nama bucket tujuan. Bucket tujuan harus berada di wilayah yang sama dengan bucket sumber. Contoh: destbucket. */
std::string CopyBucketName = "destbucket";
/* Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap. Contoh: srcdir/scrobject.txt. */
std::string SourceObjectName = "srcdir/scrobject.txt";
/* Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap. Contoh: destdir/destobject.txt. */
std::string CopyObjectName = "destdir/destobject.txt";
/* Inisialisasi sumber daya seperti sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
CopyObjectRequest request(CopyBucketName, CopyObjectName);
request.setCopySource(SourceBucketName, SourceObjectName);
/* Salin objek. */
auto outcome = client.CopyObject(request);
if (!outcome.isSuccess()) {
/* Tangani pengecualian. */
std::cout << "CopyObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya seperti sumber daya jaringan. */
ShutdownSdk();
return 0;
}Salin objek besar
Untuk menyalin objek berukuran lebih dari 1 GB, Anda harus membagi objek tersebut menjadi beberapa bagian dan menyalin bagian-bagian tersebut secara berurutan menggunakan UploadPartCopy. Untuk menerapkan penyalinan multipart, lakukan langkah-langkah berikut:
Gunakan client.InitiateMultipartUpload untuk memulai tugas penyalinan multipart.
Gunakan client.UploadPartCopy untuk menyalin bagian-bagian tersebut. Semua bagian harus berukuran lebih dari 100 KB, kecuali bagian terakhir.
Gunakan client.CompleteMultipartUpload untuk menyelesaikan tugas penyalinan multipart.
Kode berikut memberikan contoh cara menyalin objek besar:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun yang digunakan untuk mengakses OSS. */
/* Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket sumber. Contoh: srcexamplebucket. */
std::string SourceBucketName = "srcexamplebucket";
/* Tentukan nama bucket tujuan. Bucket tujuan harus berada di wilayah yang sama dengan bucket sumber. Contoh: destbucket. */
std::string CopyBucketName = "destbucket";
/* Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap. Contoh: srcdir/scrobject.txt. */
std::string SourceObjectName = "srcdir/scrobject.txt";
/* Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap. Contoh: destdir/destobject.txt. */
std::string CopyObjectName = "destdir/destobject.txt";
/* Inisialisasi sumber daya seperti sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
auto getObjectMetaReq = GetObjectMetaRequest(SourceBucketName, SourceObjectName);
auto getObjectMetaResult = client.GetObjectMeta(getObjectMetaReq);
if (!getObjectMetaResult.isSuccess()) {
std::cout << "GetObjectMeta fail" <<
",code:" << getObjectMetaResult.error().Code() <<
",message:" << getObjectMetaResult.error().Message() <<
",requestId:" << getObjectMetaResult.error().RequestId() << std::endl;
return -1;
}
/* Kueri ukuran objek sumber. */
auto objectSize = getObjectMetaResult.result().ContentLength();
/* Salin objek besar. */
InitiateMultipartUploadRequest initUploadRequest(CopyBucketName, CopyObjectName);
/* Mulai tugas penyalinan multipart. */
auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest);
auto uploadId = uploadIdResult.result().UploadId();
int64_t partSize = 100 * 1024;
PartList partETagList;
int partCount = static_cast<int>(objectSize / partSize);
/* Hitung jumlah bagian. */
if (objectSize % partSize != 0) {
partCount++;
}
/* Salin setiap bagian. */
for (int i = 1; i <= partCount; i++) {
auto skipBytes = partSize * (i - 1);
auto size = (partSize < objectSize - skipBytes) ? partSize : (objectSize - skipBytes);
auto uploadPartCopyReq = UploadPartCopyRequest(CopyBucketName, CopyObjectName, SourceBucketName, SourceObjectName,uploadId, i);
uploadPartCopyReq.setCopySourceRange(skipBytes, skipBytes + size -1);
auto uploadPartOutcome = client.UploadPartCopy(uploadPartCopyReq);
if (uploadPartOutcome.isSuccess()) {
Part part(i, uploadPartOutcome.result().ETag());
partETagList.push_back(part);
}
else {
std::cout << "UploadPartCopy fail" <<
",code:" << uploadPartOutcome.error().Code() <<
",message:" << uploadPartOutcome.error().Message() <<
",requestId:" << uploadPartOutcome.error().RequestId() << std::endl;
}
}
/* Selesaikan tugas penyalinan multipart. */
CompleteMultipartUploadRequest request(CopyBucketName, CopyObjectName, partETagList, uploadId);
auto outcome = client.CompleteMultipartUpload(request);
if (!outcome.isSuccess()) {
/* Tangani pengecualian. */
std::cout << "CompleteMultipartUpload fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya seperti sumber daya jaringan. */
ShutdownSdk();
return 0;
}Referensi
Untuk kode contoh lengkap yang digunakan untuk menyalin objek besar dan objek kecil, kunjungi GitHub.
Untuk informasi selengkapnya mengenai operasi API yang dapat dipanggil untuk menyalin objek kecil, lihat CopyObject.
Untuk informasi selengkapnya mengenai operasi API yang dapat dipanggil untuk menyalin objek besar, lihat UploadPartCopy.