Topik ini menjelaskan cara mengunggah file (objek) ke bucket yang telah diaktifkan fitur versioning.
Catatan penggunaan
Pada topik ini digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda ingin 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 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 mengunggah file, Anda harus memiliki izin
oss:PutObject. Untuk informasi selengkapnya, lihat Berikan kebijakan akses kustom kepada Pengguna RAM.
Unggah simple
Pada bucket yang diaktifkan versioning, OSS secara otomatis menghasilkan ID versi unik untuk setiap objek yang baru ditambahkan dan mengembalikan ID tersebut dalam header respons x-oss-version-id. Pada bucket dengan versioning yang ditangguhkan, ID versi objek yang baru ditambahkan adalah "null". Jika Anda mengunggah objek dengan nama yang sama, objek baru akan menimpa objek sebelumnya. OSS memastikan hanya satu versi objek yang dapat memiliki ID versi "null".
Kode berikut menunjukkan cara melakukan unggah simple:
#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 wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Inisialisasi 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);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
PutObjectRequest request(BucketName, ObjectName, content);
/* Unggah file. */
auto outcome = client.PutObject(request);
if (outcome.isSuccess()) {
std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
}
else {
/* Tangani exception. */
std::cout << "PutObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya jaringan. */
ShutdownSdk();
return 0;
}Unggah append
Pada bucket yang diaktifkan versioning, Anda hanya dapat melakukan operasi append (AppendObject) pada versi terkini dari objek yang dapat ditambahkan. Anda tidak dapat melakukan operasi AppendObject pada versi sebelumnya dari objek yang dapat ditambahkan.
Saat Anda melakukan operasi AppendObject pada versi terkini objek yang dapat ditambahkan, OSS tidak membuat versi sebelumnya untuk objek tersebut.
Saat Anda melakukan operasi PutObject atau DeleteObject pada versi terkini objek yang dapat ditambahkan, OSS menyimpan versi terkini tersebut sebagai versi sebelumnya. Anda tidak dapat lagi menambahkan data ke objek ini.
Anda tidak dapat melakukan operasi AppendObject pada versi terkini objek yang tidak dapat ditambahkan, seperti objek biasa atau penanda hapus.
Kode berikut menunjukkan cara melakukan unggah append:
#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 wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Inisialisasi 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 meta = ObjectMetaData();
meta.setContentType("text/plain");
/* Posisi untuk append pertama adalah 0. Nilai kembali menunjukkan posisi untuk append berikutnya. Append selanjutnya dimulai dari akhir file. */
std::shared_ptr<std::iostream> content1 = std::make_shared<std::stringstream>();
*content1 <<"Thank you for using Alibaba Cloud Object Storage Service!";
AppendObjectRequest request(BucketName, ObjectName, content1, meta);
request.setPosition(0L);
/* Tambahkan data ke file untuk pertama kalinya. */
auto result = client.AppendObject(request);
/* Lihat ID versi objek setelah operasi append. */
if (result.isSuccess()) {
std::cout << "versionid:" << result.result().VersionId() << std::endl;
}
else {
/* Tangani exception. */
std::cout << "AppendObject fail" <<
",code:" << result.error().Code() <<
",message:" << result.error().Message() <<
",requestId:" << result.error().RequestId() << std::endl;
return -1;
}
std::shared_ptr<std::iostream> content2 = std::make_shared<std::stringstream>();
*content2 <<"Thank you for using Alibaba Cloud Object Storage Service!";
auto position = result.result().Length();
AppendObjectRequest appendObjectRequest(BucketName, ObjectName, content2);
appendObjectRequest.setPosition(position);
/* Tambahkan data ke file untuk kedua kalinya. */
auto outcome = client.AppendObject(appendObjectRequest);
if (outcome.isSuccess()) {
std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
}
else {
/* Tangani exception. */
std::cout << "AppendObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya jaringan. */
ShutdownSdk();
return 0;
}Unggah multi-bagian
Pada bucket yang diaktifkan versioning, saat Anda memanggil operasi API CompleteMultipartUpload untuk menyelesaikan unggah multi-bagian, OSS menghasilkan ID versi unik untuk seluruh objek dan mengembalikan ID tersebut dalam header respons x-oss-version-id.
Kode berikut menunjukkan cara melakukan unggah multi-bagian:
#include <alibabacloud/oss/OssClient.h>
#include <fstream>
int64_t getFileSize(const std::string& file)
{
std::fstream f(file, std::ios::in | std::ios::binary);
f.seekg(0, f.end);
int64_t size = f.tellg();
f.close();
return size;
}
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 wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Inisialisasi 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);
InitiateMultipartUploadRequest initUploadRequest(BucketName, ObjectName);
/* Inisialisasi event unggah multi-bagian. */
auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest);
auto uploadId = uploadIdResult.result().UploadId();
std::string fileToUpload = "yourLocalFilename";
int64_t partSize = 100 * 1024;
PartList partETagList;
auto fileSize = getFileSize(fileToUpload);
int partCount = static_cast<int>(fileSize / partSize);
/* Hitung jumlah bagian. */
if (fileSize % partSize != 0) {
partCount++;
}
/* Unggah setiap bagian. */
for (int i = 1; i <= partCount; i++) {
auto skipBytes = partSize * (i - 1);
auto size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary);
content->seekg(skipBytes, std::ios::beg);
UploadPartRequest uploadPartRequest(BucketName, ObjectName, content);
uploadPartRequest.setContentLength(size);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setPartNumber(i);
auto uploadPartOutcome = client.UploadPart(uploadPartRequest);
if (uploadPartOutcome.isSuccess()) {
Part part(i, uploadPartOutcome.result().ETag());
partETagList.push_back(part);
}
else {
std::cout << "uploadPart fail" <<
",code:" << uploadPartOutcome.error().Code() <<
",message:" << uploadPartOutcome.error().Message() <<
",requestId:" << uploadPartOutcome.error().RequestId() << std::endl;
}
}
/* Selesaikan unggah multi-bagian. */
CompleteMultipartUploadRequest request(BucketName, ObjectName);
request.setUploadId(uploadId);
request.setPartList(partETagList);
auto outcome = client.CompleteMultipartUpload(request);
if (outcome.isSuccess()) {
std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
}
else {
/* Tangani exception. */
std::cout << "CompleteMultipartUpload fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya jaringan. */
ShutdownSdk();
return 0;
}Referensi
Untuk informasi selengkapnya mengenai unggah simple, lihat PutObject.
Untuk informasi selengkapnya mengenai unggah append, lihat AppendObject.
Untuk informasi selengkapnya mengenai unggah multi-bagian, lihat CompleteMultipartUpload.