Layanan Penyimpanan Objek (OSS) menyediakan fitur unggah multi-bagian yang memungkinkan Anda membagi objek besar menjadi beberapa bagian. Setelah bagian-bagian tersebut diunggah, Anda dapat memanggil operasi CompleteMultipartUpload untuk menggabungkannya menjadi satu objek utuh.
Catatan penggunaan
Untuk informasi selengkapnya mengenai wilayah dan titik akhir yang didukung OSS, lihat Wilayah dan titik akhir.
Untuk melakukan unggah multi-bagian, Anda harus memiliki izin
oss:PutObject. Untuk informasi selengkapnya, lihat Berikan izin kepada RAM user menggunakan kebijakan kustom.
Proses unggah multi-bagian
Unggah multi-bagian terdiri dari tiga langkah berikut:
Inisialisasi unggah multi-bagian.
Anda dapat memanggil metode client.initiateMultipartUpload. OSS akan mengembalikan upload ID yang bersifat unik secara global.
Unggah bagian-bagian.
Anda dapat memanggil metode client.uploadPart untuk mengunggah bagian-bagian tersebut.
CatatanUntuk upload ID tertentu, nomor bagian menunjukkan posisi relatif suatu bagian dalam objek lengkap. Jika Anda mengunggah bagian baru dengan nomor bagian yang sudah ada, bagian lama akan ditimpa.
OSS mengembalikan hash MD5 dari bagian yang diterima dalam header ETag.
OSS menghitung hash MD5 dari data yang diunggah dan membandingkannya dengan hash MD5 yang dihitung oleh SDK. Jika kedua hash tidak cocok, OSS akan mengembalikan kode kesalahan `InvalidDigest`.
Selesaikan unggah multi-bagian.
Setelah semua bagian diunggah, Anda dapat memanggil metode client.completeMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu objek utuh.
Contoh kode
Kode berikut menunjukkan cara membagi file lokal besar menjadi beberapa bagian, mengunggah bagian-bagian tersebut ke bucket secara konkuren, lalu menggabungkannya menjadi satu objek utuh.
import Client, { FilePath, RequestError, THarmonyEmptyBodyApiRes } from '@aliyun/oss';
import { fileIo as fs } from '@kit.CoreFileKit';
// Buat instans client OSS.
const client = new Client({
// Ganti dengan ID AccessKey dari kredensial akses temporary STS Anda.
accessKeyId: 'yourAccessKeyId',
// Ganti dengan Rahasia AccessKey dari kredensial akses temporary STS Anda.
accessKeySecret: 'yourAccessKeySecret',
// Ganti dengan token keamanan dari kredensial akses temporary STS Anda.
securityToken: 'yourSecurityToken',
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region menjadi oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
});
// Tentukan nama bucket yang akan digunakan. Ganti dengan nama bucket aktual Anda.
const bucket = 'yourBucketName';
// Tentukan nama objek (file) yang akan diunggah. Ganti dengan nama objek aktual Anda.
const key = 'yourObjectName';
/**
* Unggah file ke OSS menggunakan unggah multi-bagian.
* Gunakan unggah multi-bagian untuk memisahkan file besar menjadi beberapa bagian dan mengunggahnya ke bucket dan kunci yang ditentukan.
*/
const multipartUpload = async () => {
try {
// Inisialisasi tugas unggah multi-bagian dan dapatkan uploadId.
const initRes = await client.initiateMultipartUpload({
bucket, // Nama bucket
key, // Nama objek (file)
});
// Dapatkan uploadId dari respons inisialisasi. Digunakan untuk unggah bagian selanjutnya dan menyelesaikan unggah.
const uploadId = initRes.data.uploadId;
// Tentukan path file lokal.
const filePath = new FilePath('yourFilePath');// Ganti dengan path file lokal aktual.
// Dapatkan metadata file, seperti ukuran file.
const fileStat = await fs.stat(filePath.filePath);
// Tentukan ukuran setiap bagian (10 MB).
const chunkSize = 1024 * 1024 * 10;
// Hitung jumlah total bagian.
let totalParts = Math.ceil(fileStat.size / chunkSize);
// Nomor bagian saat ini.
let partNumber = 1;
// Simpan objek Promise untuk semua unggah bagian.
const waitList: Promise<THarmonyEmptyBodyApiRes>[] = [];
// Loop untuk memproses setiap bagian.
while (partNumber <= totalParts) {
// Hitung posisi awal bagian saat ini.
const offset = (partNumber - 1) * chunkSize;
// Panggil metode uploadPart untuk mengunggah bagian saat ini.
const uploadPromise = client.uploadPart({
bucket, // Nama bucket
key, // Nama objek (file)
uploadId, // UploadId yang dikembalikan dari inisialisasi.
partNumber, // Nomor bagian saat ini.
data: filePath, // Path file.
length: Math.min(chunkSize, fileStat.size - offset), // Ukuran bagian saat ini.
offset, // Offset awal bagian saat ini.
});
// Tambahkan Promise unggah bagian ke daftar tunggu.
waitList.push(uploadPromise);
// Tambah nomor bagian.
partNumber++;
}
// Tunggu hingga semua unggah bagian selesai.
const uploadResList = await Promise.all(waitList);
// Setelah semua bagian diunggah, panggil completeMultipartUpload untuk menyelesaikan tugas unggah.
const completeRes = await client.completeMultipartUpload({
bucket, // Nama bucket
key, // Nama objek (file)
uploadId, // UploadId yang dikembalikan dari inisialisasi.
completeAll: true, // Secara otomatis selesaikan semua bagian.
});
// Cetak hasil unggah multi-bagian yang telah diselesaikan.
console.log(JSON.stringify(completeRes));
} catch (err) {
// Tangkap pengecualian yang terjadi selama permintaan.
if (err instanceof RequestError) {
// Jika terjadi jenis error yang dikenal, cetak kode error, pesan error, ID permintaan, kode status, kode EC, dan informasi lainnya.
console.log('code: ', err.code); // Kode kesalahan.
console.log('message: ', err.message); // Pesan kesalahan.
console.log('requestId: ', err.requestId); // ID permintaan.
console.log('status: ', err.status); // Kode status HTTP.
console.log('ec: ', err.ec); // Kode kesalahan.
} else {
// Cetak jenis error tak dikenal lainnya.
console.log('unknown error: ', err);
}
}
};
// Panggil fungsi multipartUpload untuk menjalankan operasi unggah multi-bagian.
multipartUpload();