全部产品
Search
文档中心

Object Storage Service:Menyalin file (PHP SDK V1)

更新时间:Nov 30, 2025

Topik ini menjelaskan cara menyalin objek dari bucket sumber ke bucket tujuan yang sama atau berbeda dalam wilayah yang sama.

Catatan penggunaan

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

  • Pada topik ini, instans OSSClient dibuat dengan menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Buat OssClient.

  • Saat Pengguna Resource Access Management (RAM) melakukan operasi salin, pengguna tersebut harus memiliki izin oss:GetObject pada objek sumber serta izin oss:PutObject dan oss:GetObject pada bucket tujuan. Untuk informasi selengkapnya tentang cara memberikan kebijakan kustom kepada pengguna RAM, lihat Contoh umum kebijakan RAM.

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

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

Menyalin file kecil

Kode contoh berikut menunjukkan cara menggunakan metode $ossClient->copyObject untuk menyalin objek berukuran kurang dari 1 GB:

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
$provider = new EnvironmentVariableCredentialsProvider();
// Titik akhir wilayah China (Hangzhou) digunakan dalam contoh ini. Ganti nilainya dengan titik akhir yang sebenarnya.
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan nama bucket sumber. Contoh: srcexamplebucket.
$from_bucket = "srcexamplebucket";
// Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. Contoh: srcdir/exampleobject.txt.
$from_object = "srcdir/exampleobject.txt";
// Tentukan nama bucket tujuan yang berada dalam wilayah yang sama dengan bucket sumber. Contoh: destexamplebucket.
// Jika Anda menyalin objek dalam bucket yang sama, pastikan nama bucket sumber dan tujuan sama.
$to_bucket = "destexamplebucket";
// Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. Contoh: destdir/exampleobject.txt.
$to_object = "destdir/exampleobject.txt";

$options = array(
    'headers'=>array(
      // Tentukan apakah objek tujuan yang memiliki nama yang sama akan ditimpa. Pada contoh ini, parameter ini diatur ke true untuk mencegah penimpaan.
      // 'x-oss-forbid-overwrite' => 'true',
      // Jika ETag objek sumber sesuai dengan ETag yang Anda tentukan, OSS akan menyalin objek dan mengembalikan 200 OK.
      // 'x-oss-copy-source-if-match' => '5B3C1A2E053D763E1B002CC****',
      // Jika ETag objek sumber tidak sesuai dengan ETag yang Anda tentukan, OSS akan menyalin objek dan mengembalikan 200 OK.
      // 'x-oss-copy-source-if-none-match' => '5B3C1A2E053D763E1B002CC****',
      // Jika waktu yang ditentukan sama dengan atau lebih baru dari waktu modifikasi aktual objek, OSS akan menyalin objek dan mengembalikan 200 OK.
      // 'x-oss-copy-source-if-unmodified-since' => gmdate('2021-12-09T07:01:56.000Z'),
      // Jika waktu yang ditentukan lebih lama dari waktu modifikasi aktual objek, OSS akan menyalin objek dan mengembalikan 200 OK.
      // 'x-oss-copy-source-if-modified-since' => gmdate('2021-12-09T07:01:56.000Z'),
      // Tentukan cara mengonfigurasi metadata untuk objek tujuan. Pada contoh ini, parameter ini diatur ke COPY untuk menyalin metadata dari objek sumber ke objek tujuan.
      // 'x-oss-metadata-directive' => 'COPY',
      // Tentukan algoritma enkripsi sisi server yang digunakan OSS untuk membuat objek tujuan.
      // 'x-oss-server-side-encryption' => 'KMS',
      // Kunci master pelanggan (CMK) yang dikelola oleh KMS. Parameter ini hanya berlaku ketika x-oss-server-side-encryption diatur ke KMS.
      // 'x-oss-server-side-encryption-key-id' => '9468da86-3509-4f8d-a61e-6eab****',
      // Tentukan izin akses untuk objek tujuan. Pada contoh ini, parameter ini diatur ke private. Artinya hanya pemilik objek dan pengguna yang berwenang yang memiliki izin baca dan tulis. Pengguna lain tidak dapat mengakses objek tersebut.
      // 'x-oss-object-acl' => 'private',
      // Tentukan kelas penyimpanan objek. Pada contoh ini, parameter ini diatur ke Standard.
      // 'x-oss-storage-class' => 'Standard',
      // Tentukan tag untuk objek. Anda dapat menentukan beberapa tag.
      // 'x-oss-tagging' => 'k1=v1&k2=v2&k3=v3',
      // Tentukan cara mengonfigurasi tag untuk objek tujuan. Pada contoh ini, parameter ini diatur ke COPY untuk menyalin tag dari objek sumber ke objek tujuan.
      // 'x-oss-tagging-directive' => 'COPY',
    ),
);

try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);

    $ossClient->copyObject($from_bucket, $from_object, $to_bucket, $to_object);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": OK" . "\n");            

Menyalin file besar

Untuk menyalin objek berukuran lebih dari 1 GB, Anda harus membagi objek menjadi beberapa bagian dan menyalin bagian-bagian tersebut secara berurutan menggunakan UploadPartCopy. Langkah-langkah untuk menerapkan salin multipart adalah sebagai berikut:

  1. Panggil $ossClient->initiateMultipartUpload untuk menginisialisasi tugas salin multipart.

  2. Panggil $ossClient->uploadPartCopy untuk menyalin bagian-bagian tersebut. Semua bagian, kecuali bagian terakhir, harus berukuran lebih dari 100 KB.

  3. Panggil $ossClient->completeMultipartUpload untuk menyelesaikan tugas salin multipart.

Kode contoh berikut menunjukkan cara melakukan salin multipart:

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
$provider = new EnvironmentVariableCredentialsProvider();
// Titik akhir wilayah China (Hangzhou) digunakan dalam contoh ini. Ganti nilainya dengan titik akhir yang sebenarnya.
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// Tentukan nama bucket sumber.
$from_bucket = "yourSrcBucketName";
// Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. Contoh: srcdir/exampleobject.txt.
$from_object = "yourSrcObjectName";
// Tentukan nama bucket tujuan yang berada dalam wilayah yang sama dengan bucket sumber.
$to_bucket = "yourDestBucketName";
// Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. Contoh: destdir/exampleobject.txt.
$to_object = 'yourDestObjectName';

// Atur ukuran bagian dalam byte sesuai kebutuhan.
$part_size = 256*1024*1024;

try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);

    $objectMeta = $ossClient->getObjectMeta($from_bucket, $from_object);

    $length = $objectMeta['content-length'] + 0;

    // Inisialisasi tugas salin multipart.
    $upload_id = $ossClient->initiateMultipartUpload($to_bucket, $to_object);

    // Salin bagian-bagian.
    $pieces = $ossClient->generateMultiuploadParts($length, $part_size);
    $response_upload_part = array();
    $copyId = 1;
    $upload_position = 0;

    foreach ($pieces as $i => $piece) {
        $from_pos = $upload_position + (integer)$piece['seekTo'];
        $to_pos = (integer)$piece['length'] + $from_pos - 1;
        $up_options = array(
            'start' => $from_pos,
            'end' => $to_pos,
              'headers'=>array(
                // Jika ETag objek sumber sesuai dengan ETag yang Anda tentukan, OSS akan menyalin objek dan mengembalikan 200 OK.
                // 'x-oss-copy-source-if-match' => '5B3C1A2E053D763E1B002CC****',
                // Jika ETag objek sumber tidak sesuai dengan ETag yang Anda tentukan, OSS akan menyalin objek dan mengembalikan 200 OK.
                // 'x-oss-copy-source-if-none-match' => '5B3C1A2E053D763E1B002CC****',
                // Jika waktu yang ditentukan sama dengan atau lebih baru dari waktu modifikasi aktual objek, OSS akan menyalin objek dan mengembalikan 200 OK.
                // 'x-oss-copy-source-if-unmodified-since' => gmdate('2021-12-09T07:01:56.000Z'),
                // Jika waktu yang ditentukan lebih lama dari waktu modifikasi aktual objek, OSS akan menyalin objek dan mengembalikan 200 OK.
                // 'x-oss-copy-source-if-modified-since' => gmdate('2021-12-09T07:01:56.000Z'),
          ),
        );
        $response_upload_part[] = $ossClient->uploadPartCopy( $from_bucket, $from_object, $to_bucket, $to_object, $copyId, $upload_id, $up_options);
        $copyId = $copyId + 1;
    }

    // Selesaikan salin multipart.
    $upload_parts = array();
    foreach ($response_upload_part as $i => $etag) {
        $upload_parts[] = array(
            'PartNumber' => ($i + 1),
            'ETag' => $etag,
        );
    }
    $result = $ossClient->completeMultipartUpload($to_bucket, $to_object, $upload_id, $upload_parts);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": OK" . "\n");

Referensi

  • Menyalin file kecil

    • Untuk kode contoh lengkap menyalin file kecil, lihat GitHub.

    • Untuk informasi selengkapnya tentang operasi API untuk menyalin file kecil, lihat CopyObject.

  • Menyalin file besar

    • Untuk kode contoh lengkap menyalin file besar, lihat GitHub.

    • Untuk informasi selengkapnya tentang operasi API untuk menyalin file besar, lihat UploadPartCopy.