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 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 V1).
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 telah 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 yang telah disuspend versioning-nya, 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:
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Setel yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Setel bucketName ke nama bucket, misalnya examplebucket.
var bucketName = "examplebucket";
// Setel objectName ke path lengkap objek. Path lengkap tidak boleh mencakup nama bucket. Misalnya, exampledir/exampleobject.txt.
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
// Setel region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel region ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instans ClientConfiguration dan ubah parameter default sesuai kebutuhan.
var conf = new ClientConfiguration();
// Gunakan Signature Version 4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instans OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
MemoryStream requestContent = new MemoryStream(binaryData);
// Unggah objek.
var result = client.PutObject(bucketName, objectName, requestContent);
Console.WriteLine("Put object succeeded versionid : {0}", result.VersionId);
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}Unggah append
Pada bucket yang telah 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 dari objek yang dapat ditambahkan, OSS tidak membuat versi sebelumnya untuk objek tersebut.
Saat Anda melakukan operasi PutObject atau DeleteObject pada versi terkini dari 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 dari objek yang tidak dapat ditambahkan, seperti objek biasa atau penanda hapus.
Kode berikut menunjukkan cara melakukan unggah append:
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Setel yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Setel bucketName ke nama bucket, misalnya examplebucket.
var bucketName = "examplebucket";
// Setel objectName ke path lengkap objek. Path lengkap tidak boleh mencakup nama bucket. Misalnya, exampledir/exampleobject.txt.
var objectName = "exampleobject.txt";
// Setel localFilename ke path lengkap file lokal, misalnya D:\\localpath\\examplefile.txt. Jika Anda tidak menentukan path lokal, file akan diunggah dari direktori proyek program contoh.
var localFilename = "D:\\localpath\\examplefile.txt";
// Setel region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel region ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instans ClientConfiguration dan ubah parameter default sesuai kebutuhan.
var conf = new ClientConfiguration();
// Gunakan Signature Version 4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instans OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
// Posisi untuk operasi append pertama adalah 0. Respons berisi posisi untuk operasi append berikutnya. Posisi untuk operasi append selanjutnya adalah panjang objek sebelum penambahan.
long position = 0;
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
position = metadata.ContentLength;
}
catch (Exception) { }
try
{
using (var fs = File.Open(localFilename, FileMode.Open))
{
var request = new AppendObjectRequest(bucketName, objectName)
{
ObjectMetadata = new ObjectMetadata(),
Content = fs,
Position = position
};
// Tambahkan data ke objek.
var result = client.AppendObject(request);
// Setel posisi untuk operasi append.
position = result.NextAppendPosition;
Console.WriteLine("Append object succeeded, next append position:{0}, vesionid:{1}", position, result.VersionId);
}
// Dapatkan posisi append dan tambahkan data ke objek lagi.
using (var fs = File.Open(localFilename, FileMode.Open))
{
var request = new AppendObjectRequest(bucketName, objectName)
{
ObjectMetadata = new ObjectMetadata(),
Content = fs,
Position = position
};
var result = client.AppendObject(request);
position = result.NextAppendPosition;
Console.WriteLine("Append object succeeded, next append position:{0}, vesionid:{1}", position, result.VersionId);
}
}
catch (Exception ex)
{
Console.WriteLine("Append object failed, {0}", ex.Message);
}Unggah multi-bagian
Pada bucket yang telah 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:
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Setel yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Setel bucketName ke nama bucket, misalnya examplebucket.
var bucketName = "examplebucket";
// Setel objectName ke path lengkap objek. Path lengkap tidak boleh mencakup nama bucket. Misalnya, exampledir/exampleobject.txt.
var objectName = "exampledir/exampleobject.txt";
// Setel localFilename ke path lengkap file lokal, misalnya D:\\localpath\\examplefile.txt. Jika Anda tidak menentukan path lokal, file akan diunggah dari direktori proyek program contoh.
var localFilename = "D:\\localpath\\examplefile.txt";
// Setel region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel region ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instans ClientConfiguration dan ubah parameter default sesuai kebutuhan.
var conf = new ClientConfiguration();
// Gunakan Signature Version 4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instans OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
// Inisialisasi unggah multi-bagian.
var uploadId = "";
try
{
// Tentukan nama objek yang akan diunggah dan bucket tempat objek tersebut disimpan. Di InitiateMultipartUploadRequest, Anda dapat mengatur ObjectMeta, tetapi tidak perlu menentukan ContentLength.
var request = new InitiateMultipartUploadRequest(bucketName, objectName);
var result = client.InitiateMultipartUpload(request);
uploadId = result.UploadId;
// Cetak UploadId.
Console.WriteLine("Init multi part upload succeeded");
Console.WriteLine("Upload Id:{0}", result.UploadId);
}
catch (Exception ex)
{
Console.WriteLine("Init multi part upload failed, {0}", ex.Message);
}
// Hitung jumlah total bagian.
var partSize = 100 * 1024;
var fi = new FileInfo(localFilename);
var fileSize = fi.Length;
var partCount = fileSize / partSize;
if (fileSize % partSize != 0)
{
partCount++;
}
// Mulai unggah multi-bagian. partETags adalah daftar yang menyimpan ETag setiap bagian. Setelah OSS menerima daftar bagian, OSS memverifikasi setiap bagian. Setelah semua bagian diverifikasi, OSS menggabungkannya menjadi satu objek utuh.
var partETags = new List<PartETag>();
try
{
using (var fs = File.Open(localFilename, FileMode.Open))
{
for (var i = 0; i < partCount; i++)
{
var skipBytes = (long)partSize * i;
// Pindah ke posisi awal untuk unggah saat ini.
fs.Seek(skipBytes, 0);
// Hitung ukuran bagian yang akan diunggah. Ukuran bagian terakhir adalah sisa ukuran data.
var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
var request = new UploadPartRequest(bucketName, objectName, uploadId)
{
InputStream = fs,
PartSize = size,
PartNumber = i + 1
};
// Panggil operasi UploadPart untuk mengunggah bagian. Respons berisi ETag bagian tersebut.
var result = client.UploadPart(request);
partETags.Add(result.PartETag);
Console.WriteLine("finish {0}/{1}", partETags.Count, partCount);
}
Console.WriteLine("Put multi part upload succeeded");
}
}
catch (Exception ex)
{
Console.WriteLine("Put multi part upload failed, {0}", ex.Message);
}
// Selesaikan unggah multi-bagian.
try
{
var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId);
foreach (var partETag in partETags)
{
completeMultipartUploadRequest.PartETags.Add(partETag);
}
var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
Console.WriteLine("CompleteMultipartUpload succeeded, vesionid:{0}", result.VersionId);
}
catch (Exception ex)
{
Console.WriteLine("complete multi part failed, {0}", ex.Message);
}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.