全部产品
Search
文档中心

Object Storage Service:Unggah multi-bagian (Harmony SDK)

更新时间:Nov 30, 2025

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

Proses unggah multi-bagian

Unggah multi-bagian terdiri dari tiga langkah berikut:

  1. Inisialisasi unggah multi-bagian.

    Anda dapat memanggil metode client.initiateMultipartUpload. OSS akan mengembalikan upload ID yang bersifat unik secara global.

  2. Unggah bagian-bagian.

    Anda dapat memanggil metode client.uploadPart untuk mengunggah bagian-bagian tersebut.

    Catatan
    • Untuk 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`.

  3. 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();

Skenario umum

Batalkan event unggah multi-bagian tertentu

Anda dapat menggunakan metode client.abortMultipartUpload untuk membatalkan unggah multi-bagian.

import Client, { RequestError } from '@aliyun/oss';

// 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 yang akan digunakan. Ganti dengan nama objek aktual Anda.
const key = 'yourObjectName';

/**
 * Batalkan tugas unggah multi-bagian.
 * Gunakan metode abortMultipartUpload untuk membatalkan tugas unggah multi-bagian tertentu.
 */
const abortMultipartUpload = async () => {
  try {
    // Panggil metode abortMultipartUpload untuk membatalkan tugas unggah multi-bagian tertentu.
    const res = await client.abortMultipartUpload({
      bucket, // Nama bucket
      key,    // Nama objek (file)
      // UploadId dapat diperoleh dari respons client.initiateMultipartUpload atau client.listMultipartUploads.
      uploadId: 'uploadId', // Ganti dengan uploadId aktual.
    });

    // Cetak hasil pembatalan unggah multi-bagian.
    console.log(JSON.stringify(res));
  } 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 abortMultipartUpload untuk menjalankan operasi pembatalan unggah multi-bagian.
abortMultipartUpload();

Daftar bagian yang berhasil diunggah dalam event unggah multi-bagian tertentu

Anda dapat menggunakan metode client.listParts untuk menampilkan daftar bagian yang berhasil diunggah dalam unggah multi-bagian.

import Client, { RequestError } from '@aliyun/oss';

// 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 yang akan digunakan. Ganti dengan nama objek aktual Anda.
const key = 'yourObjectName';

/**
 * Daftar bagian yang diunggah.
 * Gunakan metode listParts untuk menampilkan informasi tentang bagian yang diunggah dalam tugas unggah multi-bagian tertentu.
 */
const listParts = async () => {
  try {
    // Panggil metode listParts untuk menampilkan informasi tentang bagian yang diunggah dalam tugas unggah multi-bagian tertentu.
    const res = await client.listParts({
      bucket, // Nama bucket
      key,    // Nama objek (file)
      // UploadId dapat diperoleh dari respons client.initiateMultipartUpload atau client.listMultipartUploads.
      uploadId: 'uploadId', // Ganti dengan uploadId aktual.
    });

    // Cetak informasi tentang bagian yang diunggah.
    console.log(JSON.stringify(res));
  } 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 listParts untuk menjalankan operasi daftar bagian yang diunggah.
listParts();

Daftar event unggah multi-bagian yang sedang berlangsung

Anda dapat menggunakan metode client.listMultipartUploads untuk menampilkan daftar unggah multi-bagian yang telah dimulai tetapi belum diselesaikan atau dibatalkan.

import Client, { RequestError } from '@aliyun/oss';

// 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';

/**
 * Daftar tugas unggah multi-bagian yang sedang berlangsung dan belum lengkap.
 * Gunakan metode listMultipartUploads untuk menampilkan daftar tugas unggah multi-bagian yang belum lengkap dalam bucket tertentu.
 */
const listMultipartUploads = async () => {
  try {
    // Panggil metode listMultipartUploads untuk menampilkan daftar tugas unggah multi-bagian yang belum lengkap dalam bucket tertentu.
    const res = await client.listMultipartUploads({
      bucket, // Nama bucket
    });

    // Cetak informasi tentang tugas unggah multi-bagian yang belum lengkap.
    console.log(JSON.stringify(res));
  } 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 listMultipartUploads untuk menjalankan operasi daftar tugas unggah multi-bagian yang belum lengkap.
listMultipartUploads();