All Products
Search
Document Center

Object Storage Service:Menyalin objek (Go SDK V1)

Last Updated:Aug 26, 2026

Salin objek dalam satu bucket atau antar bucket di wilayah yang sama.

Catatan

  • Pada topik ini, digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, 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.

  • Topik ini menunjukkan cara membuat instans OSSClient dengan titik akhir OSS. Untuk konfigurasi alternatif, seperti menggunakan domain kustom atau autentikasi dengan kredensial dari Security Token Service (STS), lihat Configure a client (Go SDK V1).

  • Anda harus memiliki izin baca pada objek sumber dan izin baca/tulis pada bucket tujuan.

  • Bucket sumber dan tujuan tidak boleh memiliki kebijakan retensi yang dikonfigurasi. Jika tidak, operasi salin akan gagal dan mengembalikan error The object you specified is immutable.

  • Salin lintas-wilayah tidak didukung. Misalnya, Anda tidak dapat menyalin objek dari bucket China (Hangzhou) ke bucket China (Qingdao).

Kode contoh

Menyalin objek kecil

Gunakan metode CopyObject untuk menyalin objek dalam bucket yang sama atau antar bucket berbeda di wilayah yang sama. Metode ini direkomendasikan untuk objek berukuran kurang dari 1 GB.

Menyalin objek dalam bucket yang sama

package main

import (
	"log"
	"time"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke titik akhir bucket. Contohnya, untuk wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir aktual.
	// Setel yourRegion ke wilayah tempat bucket berada. Contohnya, untuk wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah aktual.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

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

	// Dapatkan bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get 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 penandaan objek dari objek sumber ke objek tujuan.
		// oss.TaggingDirective(oss.TaggingCopy),
		// Tentukan izin akses (ACL) objek tujuan sebagai private saat objek tujuan dibuat.
		// oss.ObjectACL(oss.ACLPrivate),
		// Tentukan customer master key (CMK) yang dikelola oleh KMS. Parameter ini hanya berlaku jika x-oss-server-side-encryption disetel ke KMS.
		// oss.ServerSideEncryptionKeyID("9468da86-3509-4f8d-a61e-6eab1eac****"),
		// Tentukan algoritma enkripsi sisi server yang digunakan OSS untuk membuat objek tujuan.
		// oss.ServerSideEncryption("AES256"),
		// Salin metadata objek sumber ke objek tujuan.
		// oss.MetadataDirective(oss.MetaCopy),
		// Tentukan apakah operasi CopyObject menimpa objek tujuan yang memiliki nama yang sama. Pada contoh ini, nilai disetel ke true, yang mencegah penimpaan objek dengan nama yang sama.
		// oss.ForbidOverWrite(true),
		// Jika ETag objek sumber sesuai dengan ETag yang Anda berikan, operasi salin dilakukan dan 200 OK dikembalikan.
		// oss.CopySourceIfMatch("5B3C1A2E053D763E1B002CC607C5****"),
		// Jika ETag objek sumber tidak sesuai dengan ETag yang Anda berikan, operasi salin dilakukan dan 200 OK dikembalikan.
		// oss.CopySourceIfNoneMatch("5B3C1A2E053D763E1B002CC607C5****"),
		// Jika waktu yang ditentukan lebih awal daripada waktu modifikasi aktual objek, objek disalin dan 200 OK dikembalikan.
		// oss.CopySourceIfModifiedSince(time.Date(2021, time.December, 9, 7, 1, 56, 0, time.UTC)),
		// Jika waktu yang ditentukan sama dengan atau lebih baru daripada waktu modifikasi aktual objek, objek disalin dan 200 OK dikembalikan.
		// oss.CopySourceIfUnmodifiedSince(time.Date(2021, time.December, 9, 7, 1, 56, 0, time.UTC)),
		// Tentukan kelas penyimpanan objek. Pada contoh ini, nilai disetel ke Standard, yang menentukan kelas penyimpanan Standar.
		// oss.StorageClass("Standard"),
	}

	// Gunakan metadata yang ditentukan untuk menimpa metadata objek sumber.
	_, err = bucket.CopyObject(objectName, destObjectName, options...)
	if err != nil {
		log.Fatalf("Failed to copy object from '%s' to '%s': %v", objectName, destObjectName, err)
	}

	log.Printf("Successfully copied object from '%s' to '%s'", objectName, destObjectName)
}

Menyalin objek antar bucket berbeda di wilayah yang sama

package main

import (
	"log"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke titik akhir bucket. Contohnya, untuk wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir aktual.
	// Setel yourRegion ke wilayah tempat bucket berada. Contohnya, untuk wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah aktual.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

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

	// Dapatkan instans bucket tujuan.
	bucket, err := client.Bucket(destBucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket '%s': %v", destBucketName, err)
	}

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

	log.Printf("Successfully copied object from '%s/%s' to '%s/%s'", srcBucketName, srcObjectName, destBucketName, dstObjectName)
}

Menyalin objek besar

Kode contoh berikut menyalin objek besar:

package main

import (
	"log"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke titik akhir bucket. Contohnya, untuk wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir aktual.
	// Setel yourRegion ke wilayah tempat bucket berada. Contohnya, untuk wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah aktual.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// Tentukan nama bucket, misalnya examplebucket.
	bucketName := "examplebucket"

	// Dapatkan bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
	}

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

	// Pecah file menjadi beberapa bagian.
	chunks, err := oss.SplitFileByPartNum(fileName, 3)
	if err != nil {
		log.Fatalf("Failed to split file: %v", err)
	}

	// Unggah file ke OSS.
	err = bucket.PutObjectFromFile(objectSrc, fileName)
	if err != nil {
		log.Fatalf("Failed to upload object '%s' from file '%s': %v", objectSrc, fileName, err)
	}

	// Inisialisasi unggah multi-bagian.
	imur, err := bucket.InitiateMultipartUpload(objectDest)
	if err != nil {
		log.Fatalf("Failed to initiate multipart upload for '%s': %v", objectDest, err)
	}

	var parts []oss.UploadPart
	for _, chunk := range chunks {
		// Setel opsi unggah multi-bagian.
		options := []oss.Option{}

		// Lakukan salin multi-bagian.
		part, err := bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, chunk.Number, options...)
		if err != nil {
			log.Fatalf("Failed to upload part %d of '%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("Failed to complete multipart upload for '%s': %v", objectDest, err)
	}

	log.Printf("Multipart upload completed successfully for '%s'. cmur: %v", objectDest, cmur)
}

Referensi

  • Untuk kode contoh lengkap tentang menyalin objek, lihat GitHub sample.

  • Untuk deskripsi operasi API yang digunakan untuk menyalin objek kecil, lihat CopyObject.

  • Untuk deskripsi operasi API yang digunakan untuk menyalin objek besar, lihat UploadPartCopy.