全部产品
Search
文档中心

Object Storage Service:Menyalin objek (C# SDK V1)

更新时间:Nov 29, 2025

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

Catatan penggunaan

  • Pada topik ini, digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya yang berada di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.

  • 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 Inisialisasi.

  • 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 ada, pesan kesalahan 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 yang berlokasi di wilayah China (Hangzhou) ke bucket lain yang berlokasi di wilayah China (Qingdao).

Menyalin file kecil

Kode berikut memberikan contoh cara menyalin objek kecil:

using Aliyun.OSS;
using Aliyun.OSS.Common;

// Tentukan Endpoint untuk wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket sumber. Contoh: srcexamplebucket.
var sourceBucket = "srcexamplebucket";
// Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. Contoh: srcdir/scrobject.txt.
var sourceObject = "srcdir/scrobject.txt";
// Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber. Contoh: destbucket.
var targetBucket = "destbucket";
// Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. Contoh: destdir/destobject.txt.
var targetObject = "destdir/destobject.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";

// Buat instans ClientConfiguration dan ubah parameter default sesuai kebutuhan.
var conf = new ClientConfiguration();

// Gunakan Signature V4.
conf.SignatureVersion = SignatureVersion.V4;

// Buat instans OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    var metadata = new ObjectMetadata();
    // Atur metadata kustom. Metadata kustom berupa pasangan kunci-nilai. Misalnya, atur kunci ke mk1 dan nilai ke mv1.
    metadata.AddHeader("mk1", "mv1");
    metadata.AddHeader("mk2", "mv2");
    var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)
    {
        // Jika NewObjectMetadata bernilai null, metadata objek sumber akan disalin (mode COPY). Jika NewObjectMetadata tidak null, metadata objek sumber akan ditimpa (mode REPLACE).
        NewObjectMetadata = metadata 
    };
    // Salin objek.
    client.CopyObject(req);
    Console.WriteLine("Salin objek berhasil");
}
catch (OssException ex)
{
    Console.WriteLine("Gagal dengan kode kesalahan: {0}; Informasi kesalahan: {1}. \nRequestID: {2} \tHostID: {3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Gagal dengan informasi kesalahan: {0}", ex.Message);
}

Menyalin file besar

  • Salin multi-bagian

    Untuk menyalin objek yang ukurannya lebih dari 1 GB, Anda harus membagi objek tersebut menjadi beberapa bagian dan menyalin bagian-bagian tersebut secara berurutan menggunakan UploadPartCopy. Untuk menerapkan salin multi-bagian, lakukan langkah-langkah berikut:

    1. Gunakan metode InitiateMultipartUploadRequest untuk menginisialisasi event unggah multi-bagian.

    2. Gunakan metode UploadPartCopy untuk menyalin bagian-bagian tersebut.

    3. Gunakan metode CompleteMultipartUpload untuk menyelesaikan penyalinan objek.

    Kode berikut menunjukkan cara melakukan salin multi-bagian:

    using Aliyun.OSS;
    using Aliyun.OSS.Common;
    // Tentukan Endpoint untuk wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
    var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
    var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
    var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
    // Tentukan nama bucket sumber. Contoh: srcexamplebucket.
    var sourceBucket = "srcexamplebucket";
    // Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. Contoh: srcdir/scrobject.txt.
    var sourceObject = "srcdir/scrobject.txt";
    // Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber. Contoh: destbucket.
    var targetBucket = "destbucket";
    // Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. Contoh: destdir/destobject.txt.
    var targetObject = "destdir/destobject.txt";
    var uploadId = "";
    var partSize = 50 * 1024 * 1024;
    // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
    const string region = "cn-hangzhou";
    
    // Buat instans ClientConfiguration dan ubah parameter default sesuai kebutuhan.
    var conf = new ClientConfiguration();
    
    // Gunakan Signature V4.
    conf.SignatureVersion = SignatureVersion.V4;
    
    // Buat instans OssClient.
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
    client.SetRegion(region);
    try
    {
        // Inisialisasi tugas salin. Anda dapat menggunakan InitiateMultipartUploadRequest untuk menentukan metadata objek tujuan.
        var request = new InitiateMultipartUploadRequest(targetBucket, targetObject);
        var result = client.InitiateMultipartUpload(request);
        // Cetak ID unggah.
        uploadId = result.UploadId;
        Console.WriteLine("Inisialisasi unggah multi-bagian berhasil, ID Unggah: {0}", result.UploadId);
        // Hitung jumlah bagian.
        var metadata = client.GetObjectMetadata(sourceBucket, sourceObject);
        var fileSize = metadata.ContentLength;
        var partCount = (int)fileSize / partSize;
        if (fileSize % partSize != 0)
        {
            partCount++;
        }
        // Mulai salin multi-bagian.
        var partETags = new List<PartETag>();
        for (var i = 0; i < partCount; i++)
        {
            var skipBytes = (long)partSize * i;
            var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
            // Buat UploadPartCopyRequest. Anda dapat menggunakan UploadPartCopyRequest untuk menentukan kondisi tertentu.
            var uploadPartCopyRequest = new UploadPartCopyRequest(targetBucket, targetObject, sourceBucket, sourceObject, uploadId)
                {
                    PartSize = size,
                    PartNumber = i + 1,
                    // BeginIndex menentukan posisi awal bagian yang akan disalin.
                    BeginIndex = skipBytes
                };
            // Panggil metode uploadPartCopy untuk menyalin setiap bagian.
            var uploadPartCopyResult = client.UploadPartCopy(uploadPartCopyRequest);
            Console.WriteLine("UploadPartCopy : {0}", i);
            partETags.Add(uploadPartCopyResult.PartETag);
        }
        // Selesaikan salin multi-bagian.
        var completeMultipartUploadRequest =
        new CompleteMultipartUploadRequest(targetBucket, targetObject, uploadId);
        // partETags adalah daftar PartETag yang disimpan selama unggah multi-bagian. Setelah OSS menerima daftar ini, OSS akan memverifikasi setiap bagian. Jika semua bagian valid, OSS akan menggabungkannya menjadi satu objek utuh.
        foreach (var partETag in partETags)
        {
            completeMultipartUploadRequest.PartETags.Add(partETag);
        }
        var completeMultipartUploadResult = client.CompleteMultipartUpload(completeMultipartUploadRequest);
        Console.WriteLine("CompleteMultipartUpload berhasil");
    }
    catch (OssException ex)
    {
        Console.WriteLine("Gagal dengan kode kesalahan: {0}; Informasi kesalahan: {1}. \nRequestID: {2} \tHostID: {3}",
            ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Gagal dengan informasi kesalahan: {0}", ex.Message);
    }
  • Salin yang dapat dilanjutkan

    Jika tugas salin terputus, Anda dapat melanjutkannya dari checkpoint terakhir.

    Kode berikut menunjukkan cara melakukan salin yang dapat dilanjutkan:

    using Aliyun.OSS;
    // Tentukan Endpoint untuk wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
    var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
    var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
    var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
    // Tentukan nama bucket sumber. Contoh: srcexamplebucket.
    var sourceBucket = "srcexamplebucket";
    // Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. Contoh: srcdir/scrobject.txt.
    var sourceObject = "srcdir/scrobject.txt";
    // Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber. Contoh: destbucket.
    var targetBucket = "destbucket";
    // Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. Contoh: destdir/destobject.txt.
    var targetObject = "destdir/destobject.txt";
    // Tentukan file yang mencatat hasil salin. Informasi progres disimpan ke file ini. Jika tugas salin gagal, proses akan dilanjutkan dari checkpoint yang telah dicatat. Setelah salin selesai, file ini akan dihapus.
    var checkpointDir = @"yourCheckpointDir";
    // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
    const string region = "cn-hangzhou";
    
    // Buat instans ClientConfiguration dan ubah parameter default sesuai kebutuhan.
    var conf = new ClientConfiguration();
    
    // Gunakan Signature V4.
    conf.SignatureVersion = SignatureVersion.V4;
    
    // Buat instans OssClient.
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
    client.SetRegion(region);
    try
    {
        var request = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject);
        // Direktori checkpointDir menyimpan status antara untuk salin yang dapat dilanjutkan. Hal ini memungkinkan tugas dilanjutkan setelah kegagalan. Jika checkpointDir bernilai null, fitur salin yang dapat dilanjutkan dinonaktifkan, dan tugas salin akan dimulai dari awal setiap kali dijalankan.
        client.ResumableCopyObject(request, checkpointDir);
        Console.WriteLine("Salin yang dapat dilanjutkan objek baru:{0} berhasil", request.DestinationKey);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Salin yang dapat dilanjutkan objek baru gagal, {0}", ex.Message);
    }

Referensi

  • Menyalin objek kecil

    • Untuk kode contoh lengkap yang digunakan untuk menyalin objek kecil, lihat GitHub.

    • Untuk informasi selengkapnya mengenai operasi API yang digunakan untuk menyalin objek kecil, lihat CopyObject.

  • Menyalin objek besar

    • Untuk kode contoh lengkap yang digunakan untuk menyalin objek besar, lihat GitHub.

    • Untuk informasi selengkapnya mengenai operasi API yang digunakan untuk menyalin objek besar, lihat UploadPartCopy.

  • Salin yang dapat dilanjutkan

    Untuk kode contoh lengkap yang digunakan untuk salin yang dapat dilanjutkan, lihat GitHub.