全部产品
Search
文档中心

Object Storage Service:Menyalin objek menggunakan salinan multipart (Go SDK V2)

更新时间:Nov 09, 2025

Topik ini menjelaskan cara memanggil operasi UploadPartCopy dari Object Storage Service (OSS) SDK for Go 2.0 untuk menyalin objek dari bucket sumber ke bucket tujuan di wilayah yang sama menggunakan salinan multipart. Bucket tujuan dapat berupa bucket sumber atau bucket lainnya.

Catatan penggunaan

  • Kode contoh dalam topik ini menggunakan wilayah China (Hangzhou) (cn-hangzhou) sebagai contoh dan Titik akhir publik secara default. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan Titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir yang didukung oleh 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 serta izin baca dan tulis pada bucket tujuan.

  • Bucket sumber dan bucket tujuan harus berada di wilayah yang sama. Sebagai contoh, objek di bucket yang berlokasi di wilayah China (Hangzhou) tidak dapat disalin ke bucket lain 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

func (c *Client) UploadPartCopy(ctx context.Context, request *UploadPartCopyRequest, optFns ...func(*Options)) (*UploadPartCopyResult, error)

Parameter permintaan

Parameter

Tipe

Deskripsi

ctx

context.Context

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

request

*UploadPartCopyRequest

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

optFns

...func(*Options)

Parameter opsional. Untuk informasi lebih lanjut, lihat Options.

Parameter respons

Parameter

Tipe

Deskripsi

result

*UploadPartCopyResult

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

err

error

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

Proses salinan multipart

Salinan multipart melibatkan tiga langkah berikut:

  1. Mulai tugas unggah multipart.

    Gunakan metode Client.InitiateMultipartUpload untuk mendapatkan ID unggah unik di OSS.

  2. Unggah bagian-bagian.

    Gunakan metode Client.UploadPartCopy untuk mengunggah bagian-bagian.

    Catatan
    • Untuk bagian-bagian yang diunggah dengan menjalankan tugas unggah multipart menggunakan ID unggah tertentu, nomor bagian mengidentifikasi posisi relatif mereka dalam objek. Jika Anda mengunggah bagian dan menggunakan kembali nomor bagiannya untuk mengunggah bagian lain, bagian baru akan menimpa bagian asli.

    • OSS menyertakan hash MD5 dari setiap bagian yang diunggah dalam header ETag dalam respons.

    • OSS menghitung hash MD5 dari bagian yang diunggah dan membandingkan hash MD5 dengan hash MD5 yang dihitung oleh OSS SDK untuk Go. Jika kedua hash berbeda, OSS mengembalikan kode kesalahan InvalidDigest.

  3. Selesaikan tugas unggah multipart.

    Setelah semua bagian diunggah, gunakan metode Client.CompleteMultipartUpload untuk menggabungkan bagian-bagian ini menjadi objek lengkap.

Contoh

Berikut ini adalah contoh kode sampel yang menunjukkan cara menyalin objek dari bucket sumber ke bucket tujuan menggunakan salinan multipart dan menggabungkan bagian-bagian menjadi objek lengkap:

package main

import (
	"context"
	"flag"
	"log"
	"sync"

	"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.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
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 baris perintah.
	flag.Parse()

	// Tentukan ID unggah.
	var uploadId string

	// Periksa apakah nama bucket sumber kosong.
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket sumber 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")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

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

	// Inisialisasi permintaan unggah multipart.
	initRequest := &oss.InitiateMultipartUploadRequest{
		Bucket: oss.Ptr(destBucketName),
		Key:    oss.Ptr(destObjectName),
	}
	initResult, err := client.InitiateMultipartUpload(context.TODO(), initRequest)
	if err != nil {
		log.Fatalf("gagal memulai unggah multipart %v", err)
	}

	// Tampilkan hasil salinan multipart.
	log.Printf("hasil inisiasi unggah multipart:%#v\n", *initResult.UploadId)
	uploadId = *initResult.UploadId

	// Inisialisasi grup tunggu dan mutex.
	var wg sync.WaitGroup
	var parts []oss.UploadPart
	count := 3
	var mu sync.Mutex

	// Mulai beberapa goroutine untuk unggah multipart.
	for i := 0; i < count; i++ {
		wg.Add(1)
		go func(partNumber int, i int) {
			defer wg.Done()

			// Buat permintaan unggah multipart.
			partRequest := &oss.UploadPartCopyRequest{
				Bucket:       oss.Ptr(destBucketName), // Nama bucket tujuan.
				Key:          oss.Ptr(destObjectName), // Nama objek tujuan.
				SourceBucket: oss.Ptr(srcBucketName), // Nama bucket sumber.
				SourceKey:     oss.Ptr(srcObjectName), // Nama objek sumber.
				PartNumber: int32(partNumber), // Nomor bagian.
				const uploadId = '<Upload Id>'; // ID unggah tugas unggah multipart.
			}

			// Kirim permintaan unggah multipart.
			partResult, err := client.UploadPartCopy(context.TODO(), partRequest)
			if err != nil {
				log.Fatalf("gagal mengunggah salinan bagian %d: %v", partNumber, err)
			}

			// Catat hasil unggah multipart.
			part := oss.UploadPart{
				PartNumber: partRequest.PartNumber,
				ETag:       partResult.ETag,
			}

			// Gunakan mutex untuk melindungi data bersama.
			mu.Lock()
			parts = append(parts, part)
			mu.Unlock()
		}(i+1, i)
	}

	// Tunggu hingga semua goroutine selesai.
	wg.Wait()

	// Selesaikan permintaan unggah multipart.
	request := &oss.CompleteMultipartUploadRequest{
		Bucket:   oss.Ptr(destBucketName),
		Key:      oss.Ptr(destObjectName),
		UploadId: oss.Ptr(uploadId),
		CompleteMultipartUpload: &oss.CompleteMultipartUpload{
			Parts: parts,
		},
	}
	result, err := client.CompleteMultipartUpload(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal menyelesaikan unggah multipart %v", err)
	}

	// Tampilkan hasil.
	log.Printf("hasil penyelesaian unggah multipart:%#v\n", result)
}

Referensi

  • Untuk kode sampel lengkap yang digunakan untuk menyalin objek menggunakan salinan multipart, kunjungi GitHub.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk memulai tugas unggah multipart, kunjungi InitiateMultipartUpload.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyalin objek menggunakan salinan multipart, kunjungi UploadPartCopy.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyelesaikan tugas unggah multipart, kunjungi CompleteMultipartUpload.