Layanan Penyimpanan Objek (OSS) menyediakan fitur unggah multi-bagian yang memungkinkan Anda membagi objek besar menjadi beberapa bagian dan mengunggahnya secara terpisah. Setelah semua bagian diunggah, Anda dapat memanggil operasi CompleteMultipartUploadAsync untuk menggabungkan bagian-bagian tersebut menjadi satu objek utuh.
Catatan
-
Kode contoh dalam topik ini menggunakan ID wilayah
cn-hangzhoudari wilayah China (Hangzhou) sebagai contoh dan menggunakan titik akhir publik secara default. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir yang didukung oleh OSS, lihat Wilayah dan titik akhir. -
Untuk melakukan unggah multi-bagian, Anda harus memiliki izin
oss:PutObject. Untuk informasi selengkapnya, lihat Berikan izin kustom kepada RAM user.
Proses unggah multi-bagian
Unggah multi-bagian terdiri dari tiga langkah:
-
Inisialisasi tugas unggah multi-bagian.
Anda dapat memanggil metode Client.InitiateMultipartUploadAsync untuk memperoleh ID unggah yang unik secara global dari OSS.
-
Unggah bagian-bagian.
Anda dapat memanggil metode Client.UploadPartAsync untuk mengunggah data bagian tersebut.
Catatan-
Untuk ID unggah yang sama, nomor bagian menentukan posisi relatif bagian tersebut dalam objek lengkap. Jika Anda mengunggah data baru menggunakan nomor bagian yang sama, data bagian yang sudah ada di OSS akan ditimpa.
-
OSS menyertakan hash MD5 dari data bagian yang diunggah dalam header ETag pada respons.
-
OSS menghitung hash MD5 dari data yang diunggah dan membandingkannya dengan hash MD5 yang dihitung oleh kit pengembangan perangkat lunak (SDK). Jika kedua hash tidak sesuai, OSS mengembalikan kode kesalahan InvalidDigest.
-
-
Selesaikan tugas unggah multi-bagian.
Setelah semua bagian diunggah, Anda dapat memanggil metode Client.CompleteMultipartUploadAsync untuk menggabungkan semua bagian menjadi satu objek utuh.
Kode contoh
Kode berikut memberikan contoh cara membagi file lokal besar menjadi beberapa bagian, mengunggah bagian-bagian tersebut ke bucket secara konkuren, lalu menggabungkannya menjadi satu objek utuh.
using OSS = AlibabaCloud.OSS.V2; // Buat alias untuk SDK OSS Alibaba Cloud guna menyederhanakan penggunaannya.
var region = "cn-hangzhou"; // Wajib diisi. Wilayah tempat bucket berada. Contoh ini menggunakan China (Hangzhou). Atur Region ke cn-hangzhou.
var endpoint = null as string; // Opsional. Nama domain untuk mengakses OSS. Contoh ini menggunakan China (Hangzhou). Atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var bucket = "you bucket name"; // Wajib diisi. Nama bucket.
var key = "your object key"; // Wajib diisi. Nama objek yang akan diunggah.
var partSize = 512*1024; // Wajib diisi. Ukuran setiap bagian. Contoh ini menggunakan 512 * 1024, yaitu 512 KB.
var filePath = "filePath"; // Wajib diisi. Jalur file yang akan diunggah.
// Muat konfigurasi default SDK OSS. Konfigurasi ini secara otomatis membaca kredensial, seperti AccessKey, dari variabel lingkungan.
var cfg = OSS.Configuration.LoadDefault();
// Konfigurasikan secara eksplisit agar klien memperoleh kredensial dari variabel lingkungan untuk verifikasi identitas. Formatnya adalah OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// Atur wilayah bucket dalam konfigurasi.
cfg.Region = region;
// Jika titik akhir ditentukan, nilai tersebut akan menggantikan titik akhir default.
if(endpoint != null)
{
cfg.Endpoint = endpoint;
}
// Buat instans klien OSS menggunakan konfigurasi tersebut.
using var client = new OSS.Client(cfg);
// Inisialisasi unggah multi-bagian.
var initResult = await client.InitiateMultipartUploadAsync(new()
{
Bucket = bucket,
Key = key
});
// Buka file yang akan diunggah.
using var file = File.OpenRead(filePath);
long fileSize = file.Length;
long partNumber = 1;
// Simpan informasi semua bagian yang telah diunggah.
var uploadParts = new List<OSS.Models.UploadPart>();
// Unggah file dalam bentuk bagian-bagian.
for (long offset = 0; offset < fileSize; offset += partSize)
{
// Hitung ukuran bagian saat ini.
var size = Math.Min(partSize, fileSize - offset);
// Unggah satu bagian.
var upResult = await client.UploadPartAsync(new()
{
Bucket = bucket,
Key = key,
PartNumber = partNumber,
UploadId = initResult.UploadId,
Body = new OSS.IO.BoundedStream(file, offset, size)
});
// Simpan informasi bagian untuk menyelesaikan unggahan nanti.
uploadParts.Add(new() { PartNumber = partNumber, ETag = upResult.ETag });
partNumber++;
}
// Urutkan bagian berdasarkan nomor bagian.
uploadParts.Sort((left, right) => { return (left.PartNumber > right.PartNumber) ? 1 : -1; });
// Selesaikan unggah multi-bagian.
var cmResult = await client.CompleteMultipartUploadAsync(new()
{
Bucket = bucket,
Key = key,
UploadId = initResult.UploadId,
CompleteMultipartUpload = new ()
{
Parts = uploadParts
}
});
// Cetak hasil unggahan.
Console.WriteLine("MultipartUpload done"); // Menunjukkan bahwa operasi telah selesai.
Console.WriteLine($"StatusCode: {cmResult.StatusCode}"); // Kode status HTTP.
Console.WriteLine($"RequestId: {cmResult.RequestId}"); // ID permintaan, yang digunakan untuk troubleshooting di Alibaba Cloud.
Console.WriteLine("Response Headers:"); // Header respons.
cmResult.Headers.ToList().ForEach(x => Console.WriteLine(x.Key + " : " + x.Value)); // Telusuri dan cetak semua header respons.
Dokumen terkait
Untuk kode contoh lengkap unggah multi-bagian, lihat multipartUpload.cs.