All Products
Search
Document Center

Object Storage Service:Copy objects (Node.js SDK)

Last Updated:Nov 30, 2025

Topik ini menjelaskan cara menyalin objek dalam satu bucket atau antar-bucket di wilayah yang sama.

Catatan Penggunaan

  • Pada topik ini, titik akhir publik wilayah China (Hangzhou) digunakan. Untuk mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk detail wilayah dan titik akhir yang didukung, lihat Regions and endpoints.

  • Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Configure access credentials.

  • 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 Configuration examples for common scenarios.

  • Untuk menyalin objek, Anda harus memiliki izin baca pada objek sumber serta izin baca dan tulis pada bucket tujuan.

  • Pastikan tidak ada kebijakan retensi yang dikonfigurasi untuk bucket sumber maupun bucket tujuan. Jika tidak, pesan error The object you specified is immutable. akan dikembalikan.

  • Bucket sumber dan bucket tujuan harus berada di wilayah yang sama. Misalnya, objek tidak dapat disalin dari bucket di wilayah China (Hangzhou) ke bucket lain di wilayah China (Qingdao).

Permissions

Secara default, Akun Alibaba Cloud memiliki izin penuh. Pengguna RAM atau Peran RAM di bawah Akun Alibaba Cloud tidak memiliki izin apa pun secara default. Akun Alibaba Cloud atau administrator akun harus memberikan izin operasi melalui RAM Policy atau Bucket policies.

API

Action

Definition

CopyObject

oss:GetObject

Menyalin objek dalam satu bucket atau antar-bucket di wilayah yang sama.

oss:PutObject

oss:GetObjectVersion

Jika Anda menentukan versi objek sumber melalui versionId, izin ini juga diperlukan.

oss:GetObjectTagging

Jika Anda menyalin tag objek melalui x-oss-tagging, izin-izin ini diperlukan.

oss:PutObjectTagging

oss:GetObjectVersionTagging

Jika Anda menentukan tag untuk versi tertentu dari objek sumber melalui versionId, izin ini juga diperlukan.

kms:GenerateDataKey

Saat menyalin objek, jika metadata objek tujuan berisi X-Oss-Server-Side-Encryption: KMS, kedua izin ini diperlukan.

kms:Decrypt

Copy a small object

Anda dapat menggunakan metode copy untuk menyalin objek berukuran maksimal 1 GB dalam bucket yang sama atau ke bucket berbeda di wilayah yang sama.

  • Copy an object within the same bucket

    Kode contoh berikut menunjukkan cara menyalin objek dalam bucket yang sama.

    const OSS = require('ali-oss');
    const client = new OSS({
      // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region menjadi oss-cn-hangzhou.
      region: 'yourRegion',
      // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      authorizationV4: true,
      // Tentukan nama bucket. Contoh: examplebucket.
      bucket: 'examplebucket',
      // Tentukan apakah HTTPS diaktifkan. Jika Anda mengatur secure ke true, HTTPS diaktifkan.
      // secure: true
    })
    
    // Salin objek dalam satu bucket.
    async function copySmallObjecInSameBucket() {
      try {
        // Tentukan path lengkap objek tujuan dan objek sumber. Jangan sertakan nama bucket dalam path lengkap tersebut.
        // Tentukan Header HTTP dan metadata kustom untuk objek tujuan.
        const result = await client.copy('destexampleobject.txt', 'srcexampleobject.txt', {
          // Konfigurasikan parameter headers untuk menentukan Header HTTP objek tujuan. Jika Anda tidak mengonfigurasi parameter headers, Header HTTP objek tujuan akan sama dengan Header HTTP objek sumber. Header HTTP objek sumber akan disalin.
          headers: {
            'Cache-Control': 'no-cache',
            // Jika nilai ETag objek sumber sama dengan nilai ETag yang ditentukan dalam permintaan, OSS menyalin objek dan mengembalikan 200 OK.
            'if-match': '5B3C1A2E053D763E1B002CC607C5****',
            // Jika nilai ETag yang Anda tentukan dalam permintaan berbeda dari nilai ETag objek sumber, OSS menyalin objek dan mengembalikan 200 OK.
            'if-none-match': '5B3C1A2E053D763E1B002CC607C5****',
            // Jika waktu yang ditentukan dalam permintaan lebih awal daripada waktu modifikasi objek, OSS menyalin objek dan mengembalikan 200 OK.
            'if-modified-since': '2021-12-09T07:01:56.000Z',
            // Jika objek sumber belum dimodifikasi sejak waktu yang ditentukan, objek tersebut disalin dan 200 OK dikembalikan.
            'if-unmodified-since': '2021-12-09T07:01:56.000Z',
            // Tentukan daftar kontrol akses (ACL) objek tujuan. Pada contoh ini, ACL diatur ke private, yang berarti hanya pemilik objek dan pengguna yang berwenang yang memiliki izin baca dan tulis terhadap objek tersebut. Pengguna lain tidak memiliki izin untuk mengakses objek tersebut.
            'x-oss-object-acl': 'private',
            // Tentukan tag untuk objek. Anda dapat menentukan beberapa tag sekaligus untuk objek tersebut.
            'x-oss-tagging': 'Tag1=1&Tag2=2',
            // Tentukan apakah operasi CopyObject menimpa objek yang sudah ada dengan nama yang sama. Pada contoh ini, parameter ini diatur ke true, yang berarti operasi CopyObject tidak akan menimpa objek yang sudah ada dengan nama yang sama.
            'x-oss-forbid-overwrite': 'true',
          },
          // Konfigurasikan parameter meta untuk menentukan metadata objek tujuan. Jika Anda tidak mengonfigurasi parameter meta, metadata objek tujuan akan sama dengan metadata objek sumber. Metadata objek sumber akan disalin.
          meta: {
            location: 'hangzhou',
            year: 2015,
            people: 'mary',
          },
        });
        console.log(result);
      } catch (e) {
        console.log(e);
      }
    }
    
    copySmallObjecInSameBucket()
  • Menyalin objek antar bucket dalam wilayah yang sama. Contoh kode berikut menunjukkan cara menyalin objek antar bucket dalam wilayah yang sama.

    Kode contoh berikut menunjukkan cara menyalin objek antar-bucket di wilayah yang sama.

    const OSS = require('ali-oss');
    const client = new OSS({
    
      // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region menjadi oss-cn-hangzhou.
      region: 'yourRegion',
      // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      authorizationV4: true,
      // Tentukan nama bucket tujuan.
      bucket: 'destexamplebucket',
    });
    
    async function copySmallObjectBetweenBuckets() {
      try {
        // Tentukan nama objek tujuan destobject.txt, nama objek sumber srcobject.txt, dan nama bucket tempat objek sumber berada.
        const result = await client.copy('destobject.txt', 'srcobject.txt', 'srcbucket', {
          // Konfigurasikan parameter headers untuk menentukan Header HTTP objek tujuan. Jika Anda tidak mengonfigurasi parameter headers, Header HTTP objek tujuan akan sama dengan Header HTTP objek sumber. Header HTTP objek sumber akan disalin.
          headers: {
            'Cache-Control': 'no-cache',
          },
          // Konfigurasikan parameter meta untuk menentukan metadata objek tujuan. Jika Anda tidak mengonfigurasi parameter meta, metadata objek tujuan akan sama dengan metadata objek sumber. Metadata objek sumber akan disalin.
          meta: {
            location: 'hangzhou',
            year: 2015,
            people: 'mary',
          },
        });
        console.log(result);
      } catch (e) {
        console.log(e);
      }
    }
    
    copySmallObjectBetweenBuckets()

Copy a large object

Untuk objek berukuran lebih dari 1 GB, Anda dapat menggunakan metode multipartUploadCopy untuk melakukan penyalinan multipart.

Kode contoh berikut menunjukkan cara menyalin objek antar-bucket di wilayah yang sama.

const OSS = require("ali-oss");

const client = new OSS({
  // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region menjadi oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Tentukan nama bucket tujuan.
  bucket: "destexamplebucket",
});

async function copyLargeObjectBetweenDifferentBuckets() {
  try {
    const copyheaders = {
      // Jika nilai ETag objek sumber sama dengan nilai ETag yang ditentukan dalam permintaan, OSS menyalin objek. Jika tidak, OSS mengembalikan kode status HTTP 412 (PreconditionFailed).
      "x-oss-copy-source-if-match": "5B3C1A2E053D763E1B002CC607C5****",
      // Jika nilai ETag objek sumber berbeda dari nilai ETag yang ditentukan dalam permintaan, OSS menyalin objek dan mengembalikan 200 OK. Jika tidak, OSS mengembalikan kode status HTTP 304 (NotModified).  
      "x-oss-copy-source-if-none-match": "5B3C1A2E053D763E1B002CC607C5****",
      // Jika waktu yang ditentukan dalam permintaan lebih lambat atau sama dengan waktu modifikasi objek, OSS menyalin objek dan mengembalikan 200 OK. Jika tidak, OSS mengembalikan kode status HTTP 412 (PreconditionFailed).  
      "x-oss-copy-source-if-unmodified-since": "2022-12-09T07:01:56.000Z",
      // Jika waktu yang ditentukan dalam permintaan lebih awal daripada waktu modifikasi objek, OSS menyalin objek dan mengembalikan 200 OK. Jika tidak, OSS mengembalikan kode status HTTP 304 (NotModified).
      "x-oss-copy-source-if-modified-since": "2022-12-09T07:01:56.000Z",
    };

    const headers = {
      // Tentukan perilaku caching halaman web saat objek diunduh.
      "Cache-Control": "no-cache",
      // Tentukan nama objek saat objek diunduh.
      "Content-Disposition": "somename",
      // Tentukan waktu kedaluwarsa dalam milidetik.
      Expires: "1000",
    };

    let savedCpt;
    // Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: destexampleobject1.txt.
    const r1 = await client.multipartUploadCopy("destexampleobject1.txt", {
      // Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: srcexampleobject.txt.
      sourceKey: "srcexampleobject.txt",
      // Tentukan nama bucket sumber. Contoh: sourcebucket.  
      sourceBucketName: "sourcebucket",
      copyheaders: copyheaders,
    });
    console.log(r1);

    // Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: destexampleobject2.txt.
    const r2 = await client.multipartUploadCopy("destexampleobject2.txt", {
      // Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: srcexampleobject.txt.
      sourceKey: "srcexampleobject.txt",
      // Tentukan nama bucket sumber. Contoh: sourcebucket.
      sourceBucketName: "sourcebucket",
    }, {
      // Atur jumlah bagian yang dapat diunggah secara paralel.
      parallel: 4,
      // Atur ukuran bagian.
      partSize: 1024 * 1024,
      progress: function (p, cpt, res) {
        console.log(p);
        savedCpt = cpt;
        console.log(cpt);
        console.log(res.headers["x-oss-request-id"]);
      },
      headers: headers,
      copyheaders: copyheaders,
    });
    console.log(r2);

    // Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: destexampleobject3.txt.
    const r3 = await client.multipartUploadCopy("destexampleobject3.txt", {
      // Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: srcexampleobject.txt.
      sourceKey: "srcexampleobject.txt",
      // Tentukan nama bucket sumber. Contoh: sourcebucket.
      sourceBucketName: "sourcebucket",
    }, {
      checkpoint: savedCpt,
      progress: function (p, cpt, res) {
        console.log(p);
        console.log(cpt);
        console.log(res.headers["x-oss-request-id"]);
      },
    });
    console.log(r3);
  } catch (e) {
    console.log(e);
  }
}

copyLargeObjectBetweenDifferentBuckets()

References

  • Copy a small object

    • Untuk kode contoh lengkap penyalinan objek kecil, lihat GitHub example.

    • Untuk informasi selengkapnya tentang operasi API penyalinan objek kecil, lihat CopyObject.

  • Copy a large object

    • Untuk kode contoh lengkap penyalinan objek besar, lihat GitHub example.

    • Untuk informasi selengkapnya tentang operasi API penyalinan objek besar, lihat UploadPartCopy.