全部产品
Search
文档中心

Object Storage Service:Copier (Go SDK V2)

更新时间:Nov 09, 2025

Topik ini menjelaskan cara menyalin objek besar menggunakan modul Copier baru dari Object Storage Service (OSS) SDK for Go V2.

Catatan penggunaan

  • Kode contoh dalam topik ini menggunakan ID wilayah cn-hangzhou, yang menentukan wilayah China (Hangzhou). Secara default, titik akhir publik digunakan untuk mengakses sumber daya di bucket. Jika Anda ingin mengakses sumber daya di bucket dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan bucket tersebut, 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.

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

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

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

Metode

Pengenalan Copy Manager

Jika Anda ingin menyalin objek dari satu bucket ke bucket lain atau memodifikasi atribut objek, Anda dapat memanggil operasi CopyObject atau operasi UploadPartCopy. Kedua operasi tersebut cocok untuk skenario yang berbeda:

  • Operasi CopyObject hanya cocok untuk menyalin objek yang lebih kecil dari 5 GiB.

  • Operasi UploadPartCopy cocok untuk menyalin objek yang berukuran sama dengan atau lebih besar dari 5 GiB. Perlu diperhatikan bahwa operasi ini tidak mendukung direktif x-oss-metadata-directive dan x-oss-tagging-directive. Untuk mengonfigurasi metadata dan penandaan selama operasi salinan multipart, Anda memerlukan implementasi tambahan.

Modul Copier menyembunyikan perbedaan operasi dan detail implementasi, serta menyediakan solusi universal untuk menyalin objek. Copier secara otomatis memilih operasi yang sesuai berdasarkan parameter permintaan yang ditentukan. Berikut adalah metode umum dari modul Copier:

type Copier struct {
  ...
}

// Buat Copier.
func (c *Client) NewCopier(optFns ...func(*CopierOptions)) *Copier

// Salin objek.
func (c *Copier) Copy(ctx context.Context, request *CopyObjectRequest, optFns ...func(*CopierOptions)) (*CopyResult, error)

Parameter permintaan

Parameter

Tipe

Deskripsi

ctx

context.Context

Konteks permintaan, yang dapat digunakan untuk menentukan durasi total permintaan.

request

*CopyObjectRequest

Parameter operasi API tertentu. Untuk informasi lebih lanjut, lihat CopyObjectRequest.

optFns

...func(*CopierOptions)

Parameter opsional. Untuk informasi lebih lanjut, lihat CopierOptions.

Parameter Umum CopyObjectRequest

Parameter

Tipe

Deskripsi

Bucket

*string

Nama bucket tujuan.

Key

*string

Nama objek tujuan.

SourceBucket

*string

Nama bucket sumber.

SourceKey

*string

Nama objek sumber.

ForbidOverwrite

*string

Menentukan apakah operasi CopyObject menonaktifkan penimpaan objek dengan nama yang sama.

Tagging

*string

Penandaan objek tujuan. Anda dapat mengonfigurasi beberapa penandaan untuk objek tujuan. Contoh: TagA=A&TagB=B.

TaggingDirective

*string

Metode yang digunakan untuk mengonfigurasi penandaan untuk objek tujuan. Nilai:

  • Copy (default): Penandaan objek sumber disalin ke objek tujuan.

  • Replace: Penandaan yang ditentukan dalam permintaan ditambahkan ke objek tujuan.

Parameter Umum CopierOptions

Parameter

Tipe

Deskripsi

PartSize

int64

Ukuran bagian. Ukuran bagian default adalah 64 MiB.

ParallelNum

int

Jumlah tugas unggah paralel. Nilai default adalah 3. Pengaturan ini spesifik untuk pemanggilan ini saja dan tidak berlaku secara global.

MultipartCopyThreshold

int64

Ukuran objek minimum untuk memanggil operasi salinan multipart. Ukuran default adalah 200 MiB.

LeavePartsOnError

bool

Menentukan apakah akan mempertahankan bagian yang disalin jika terjadi kegagalan salinan. Secara default, bagian yang disalin tidak dipertahankan.

DisableShallowCopy

bool

Menentukan apakah akan menonaktifkan salinan dangkal. Secara default, salinan dangkal diaktifkan.

Parameter respons

Parameter

Tipe

Deskripsi

result

*CopyResult

Respons terhadap operasi. Parameter ini tersedia ketika nilai err adalah nil. Untuk informasi lebih lanjut, lihat CopyResult.

err

error

Status permintaan. Jika permintaan gagal, nilai err tidak nil.

Kode contoh

Berikut ini adalah kode contoh yang mengilustrasikan cara menyalin objek dari bucket sumber ke bucket tujuan dan memodifikasi atribut objek:

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// Tentukan variabel global.
var (
	region         string // Wilayah.
	srcBucketName  string // Nama bucket sumber.
	srcObjectName  string // Nama objek sumber.
	destBucketName string // Nama bucket tujuan.
	destObjectName string // Nama objek tujuan.
)

// Gunakan fungsi init untuk menginisialisasi parameter.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "Nama bucket sumber.")
	flag.StringVar(&srcObjectName, "src-object", "", "Nama objek sumber.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "Nama bucket tujuan.")
	flag.StringVar(&destObjectName, "dest-object", "", "Nama objek tujuan.")
}

func main() {
	// Parsing parameter.
	flag.Parse()

	// Periksa apakah nama bucket sumber kosong.
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket diperlukan")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah diperlukan")
	}

	// Jika nama bucket tujuan tidak ditentukan, nama bucket sumber digunakan.
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// Periksa apakah nama objek sumber kosong.
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek sumber diperlukan")
	}

	// Periksa apakah nama objek tujuan kosong.
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek tujuan diperlukan")
	}

	// Buat konfigurasi klien OSS.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat Copier.
	c := client.NewCopier()

	// Buat permintaan untuk menyalin objek.
	request := &oss.CopyObjectRequest{
		Bucket:            oss.Ptr(destBucketName),  // Nama bucket tujuan.
		Key:               oss.Ptr(destObjectName),  // Nama objek tujuan.
		SourceKey:     oss.Ptr(srcObjectName), // Nama objek sumber.
		SourceBucket:      oss.Ptr(srcBucketName),   // Nama bucket sumber.
		StorageClass: oss.StorageClassStandard, // Tetapkan kelas penyimpanan objek tujuan ke Standard.
		MetadataDirective: oss.Ptr("Replace"), // Abaikan metadata objek sumber.
		TaggingDirective:  oss.Ptr("Replace"),       // Abaikan penandaan objek sumber.
	}

	// Salin objek.
	result, err := c.Copy(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal menyalin objek %v", err) // Dalam kasus kesalahan, catat kesalahan dan keluar dari operasi.
	}

	// Tampilkan hasil operasi.
	log.Printf("hasil salinan objek:%#v\n", result)
}

Referensi