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:
Mulai tugas unggah multipart.
Gunakan metode Client.InitiateMultipartUpload untuk mendapatkan ID unggah unik di OSS.
Unggah bagian-bagian.
Gunakan metode Client.UploadPartCopy untuk mengunggah bagian-bagian.
CatatanUntuk 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.
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(®ion, "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.