All Products
Search
Document Center

Object Storage Service:Menyalin objek menggunakan Go SDK

Last Updated:Aug 08, 2025

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

Catatan penggunaan

  • Dalam topik ini, titik akhir publik Wilayah China (Hangzhou) digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.

  • Dalam topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi Kredensial Akses.

  • Dalam topik ini, instans OSSClient dibuat dengan menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient dengan menggunakan nama domain kustom atau Layanan Token Keamanan (STS), lihat Konfigurasi Instans OSSClient.

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

  • Pastikan tidak ada kebijakan retensi yang dikonfigurasi untuk bucket sumber dan bucket tujuan. Jika tidak, pesan kesalahan Objek yang Anda tentukan tidak dapat diubah. akan dikembalikan.

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

Kode contoh

Menyalin objek kecil

Anda dapat memanggil CopyObject untuk menyalin objek dalam bucket yang sama atau antar bucket di wilayah yang sama. Kami merekomendasikan agar Anda memanggil CopyObject untuk menyalin objek yang ukurannya lebih kecil dari 1 GB.

Menyalin objek dalam bucket yang sama

package main

import (
	"log"
	"time"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Memperoleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
	}

	// Membuat instans OSSClient.
	// Tentukan titik akhir wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Tentukan titik akhir sebenarnya.
	// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. Tentukan wilayah sebenarnya.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Tentukan versi algoritma tanda tangan.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat klien OSS: %v", err)
	}

	// Tentukan nama bucket. Contoh: examplebucket.
	bucketName := "examplebucket"
	// Tentukan jalur lengkap objek sumber. Contoh: srcdir/srcobject.jpg.
	objectName := "srcdir/srcobject.jpg"
	// Tentukan jalur lengkap objek tujuan. Contoh: destdir/destobject.jpg.
	destObjectName := "destdir/destobject.jpg"

	// Memperoleh informasi bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
	}

	// Tentukan metadata objek tujuan.
	expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
	tag1 := oss.Tag{
		Key:   "a",
		Value: "1",
	}

	taggingInfo := oss.Tagging{
		Tags: []oss.Tag{tag1},
	}

	options := []oss.Option{
		oss.MetadataDirective(oss.MetaReplace),
		oss.Expires(expires),
		oss.SetTagging(taggingInfo),
		// Salin tag objek sumber ke objek tujuan.
		// oss.TaggingDirective(oss.TaggingCopy),
		// Atur daftar kontrol akses (ACL) objek tujuan menjadi pribadi saat OSS membuat objek tujuan.
		// oss.ObjectACL(oss.ACLPrivate),
		// Tentukan kunci master pelanggan (CMK) yang dikelola oleh Key Management Service (KMS). Parameter ini hanya berlaku jika x-oss-server-side-encryption diatur ke KMS.
		// oss.ServerSideEncryptionKeyID("9468da86-3509-4f8d-a61e-6eab1eac****"),
		// Tentukan algoritma enkripsi sisi server yang digunakan untuk mengenkripsi objek tujuan saat OSS membuat objek tersebut.
		// oss.ServerSideEncryption("AES256"),
		// Salin metadata objek sumber ke objek tujuan.
		// oss.MetadataDirective(oss.MetaCopy),
		// Tentukan apakah operasi CopyObject menimpa objek yang memiliki nama yang sama dengan bucket sumber. Dalam contoh ini, parameter ini diatur ke true. Nilai true menunjukkan bahwa operasi tidak menimpa objek yang memiliki nama yang sama dengan bucket sumber.
		// oss.ForbidOverWrite(true),
		// Jika nilai ETag yang Anda tentukan dalam permintaan sama dengan nilai ETag objek sumber, OSS menyalin objek dan mengembalikan 200 OK.
		// oss.CopySourceIfMatch("5B3C1A2E053D763E1B002CC607C5****"),
		// Jika nilai ETag yang Anda tentukan dalam permintaan berbeda dari nilai ETag objek sumber, OSS menyalin objek dan mengembalikan 200 OK.
		// oss.CopySourceIfNoneMatch("5B3C1A2E053D763E1B002CC607C5****"),
		// Jika waktu yang ditentukan dalam permintaan lebih awal dari waktu sebenarnya saat objek dimodifikasi, OSS menyalin objek dan mengembalikan 200 OK.
		// oss.CopySourceIfModifiedSince(time.Date(2021, time.December, 9, 7, 1, 56, 0, time.UTC)),
		// Jika waktu yang ditentukan dalam permintaan sama dengan atau lebih lambat dari waktu modifikasi objek, OSS menyalin objek dan mengembalikan 200 OK.
		// oss.CopySourceIfUnmodifiedSince(time.Date(2021, time.December, 9, 7, 1, 56, 0, time.UTC)),
		// Tentukan kelas penyimpanan objek tujuan. Dalam contoh ini, kelas penyimpanan diatur ke Jenis Penyimpanan Standar.
		// oss.StorageClass("Standard"),
	}

	// Timpa metadata objek sumber dengan metadata yang Anda tentukan dalam permintaan.
	_, err = bucket.CopyObject(objectName, destObjectName, options...)
	if err != nil {
		log.Fatalf("Gagal menyalin objek dari '%s' ke '%s': %v", objectName, destObjectName, err)
	}

	log.Printf("Berhasil menyalin objek dari '%s' ke '%s'", objectName, destObjectName)
}

Menyalin objek antar bucket di wilayah yang sama

package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Memperoleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
	}

	// Membuat instans OSSClient.
	// Tentukan titik akhir wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Tentukan titik akhir sebenarnya.
	// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. Tentukan wilayah sebenarnya.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Tentukan versi algoritma tanda tangan.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat klien OSS: %v", err)
	}

	// Tentukan nama bucket sumber. Contoh: srcbucket.
	srcBucketName := "srcbucket"
	// Tentukan jalur lengkap objek sumber. Contoh: srcobject.jpg.
	srcObjectName := "srcobject.jpg"
	// Tentukan jalur lengkap objek tujuan. Contoh: destobject.jpg.
	dstObjectName := "destobject.jpg"
	// Tentukan nama bucket tujuan. Contoh: destbucket.
	destBucketName := "destbucket"

	// Buat bucket tujuan.
	bucket, err := client.Bucket(destBucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket '%s': %v", destBucketName, err)
	}

	// Salin objek srcobject.jpg dari srcbucket ke objek destobject.jpg di destbucket.
	_, err = bucket.CopyObjectFrom(srcBucketName, srcObjectName, dstObjectName)
	if err != nil {
		log.Fatalf("Gagal menyalin objek dari '%s/%s' ke '%s/%s': %v", srcBucketName, srcObjectName, destBucketName, dstObjectName, err)
	}

	log.Printf("Berhasil menyalin objek dari '%s/%s' ke '%s/%s'", srcBucketName, srcObjectName, destBucketName, dstObjectName)
}

Menyalin objek besar

Kode berikut memberikan contoh cara menyalin objek besar:

package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Memperoleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
	}

	// Membuat instans OSSClient.
	// Tentukan titik akhir wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Tentukan titik akhir sebenarnya.
	// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di Wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. Tentukan wilayah sebenarnya.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Tentukan versi algoritma tanda tangan.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat klien OSS: %v", err)
	}

	// Tentukan nama bucket. Contoh: examplebucket.
	bucketName := "examplebucket"

	// Memperoleh informasi bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
	}

	// Tentukan jalur lengkap objek sumber. Contoh: srcobject.txt.
	objectSrc := "srcobject.txt"
	// Tentukan jalur lengkap objek tujuan. Contoh: destobject.txt.
	objectDest := "destobject.txt"
	// Tentukan jalur lengkap file lokal.
	fileName := "D:\\localpath\\examplefile.txt"

	// Membagi objek menjadi beberapa bagian.
	chunks, err := oss.SplitFileByPartNum(fileName, 3)
	if err != nil {
		log.Fatalf("Gagal membagi file: %v", err)
	}

	// Unggah file ke OSS.
	err = bucket.PutObjectFromFile(objectSrc, fileName)
	if err != nil {
		log.Fatalf("Gagal mengunggah objek '%s' dari file '%s': %v", objectSrc, fileName, err)
	}

	// Mulai Unggah Multi-bagian.
	imur, err := bucket.InitiateMultipartUpload(objectDest)
	if err != nil {
		log.Fatalf("Gagal memulai unggah multi-bagian untuk '%s': %v", objectDest, err)
	}

	var parts []oss.UploadPart
	for _, chunk := range chunks {
		// Tentukan opsi untuk Unggah Multi-bagian.
		options := []oss.Option{}

		// Salin bagian yang diunggah.
		part, err := bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, chunk.Number, options...)
		if err != nil {
			log.Fatalf("Gagal mengunggah bagian %d dari '%s': %v", chunk.Number, objectSrc, err)
		}
		parts = append(parts, part)
	}

	// Selesaikan Unggah Multi-bagian.
	cmur, err := bucket.CompleteMultipartUpload(imur, parts)
	if err != nil {
		log.Fatalf("Gagal menyelesaikan unggah multi-bagian untuk '%s': %v", objectDest, err)
	}

	log.Printf("Unggah multi-bagian berhasil diselesaikan untuk '%s'. cmur: %v", objectDest, cmur)
}

Referensi

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

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyalin objek kecil, lihat CopyObject.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyalin objek besar, lihat UploadPartCopy.