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:
|
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(®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.
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
Untuk operasi API dari copy manager, lihat Copy.