全部产品
Search
文档中心

Object Storage Service:Menyalin objek menggunakan OSS SDK untuk Go 2.0

更新时间:Aug 06, 2025

Topik ini menjelaskan cara menggunakan metode CopyObject dari OSS SDK untuk Go 2.0 untuk menyalin objek berukuran kurang dari 5 GiB dari bucket sumber ke bucket tujuan di wilayah yang sama. Bucket tujuan dapat berupa bucket sumber atau bucket lainnya.

Catatan penggunaan

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

  • Pastikan bahwa 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.

Izin

Secara default, Akun Alibaba Cloud memiliki izin penuh. Pengguna RAM atau Peran RAM di bawah Akun Alibaba Cloud tidak memiliki izin apa pun secara default. Akun Alibaba Cloud atau administrator akun harus memberikan izin operasi melalui Kebijakan RAM atau Kebijakan Bucket.

API

Aksi

Definisi

CopyObject

oss:GetObject

Menyalin objek dalam bucket atau antar bucket di wilayah yang sama.

oss:PutObject

oss:GetObjectVersion

Jika Anda menentukan versi objek sumber melalui versionId, izin ini juga diperlukan.

oss:GetObjectTagging

Jika Anda menyalin tag objek melalui x-oss-tagging, izin ini diperlukan.

oss:PutObjectTagging

oss:GetObjectVersionTagging

Jika Anda menentukan tag versi tertentu dari objek sumber melalui versionId, izin ini juga diperlukan.

kms:GenerateDataKey

Saat menyalin objek, jika metadata objek tujuan berisi X-Oss-Server-Side-Encryption: KMS, kedua izin ini diperlukan.

kms:Decrypt

Metode

func (c *Client) CopyObject(ctx context.Context, request *CopyObjectRequest, optFns ...func(*Options)) (*CopyObjectResult, error)

Parameter permintaan

Parameter

Tipe

Deskripsi

ctx

context.Context

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

request

*CopyObjectRequest

Menentukan parameter operasi API tertentu. Untuk informasi lebih lanjut, lihat CopyObjectRequest.

optFns

...func(*Options)

Parameter opsional. Untuk informasi lebih lanjut, lihat Options.

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 menimpa objek yang sudah ada dengan nama yang sama.

Tagging

*string

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

TaggingDirective

*string

Metode yang digunakan untuk mengonfigurasi tag untuk objek tujuan. Nilai valid:

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

  • Replace: Tag yang ditentukan dalam permintaan dikonfigurasikan untuk objek tujuan.

Parameter tanggapan

Parameter tanggapan

Tipe

Deskripsi

result

*CopyObjectResult

Tanggapan atas operasi. Parameter ini valid ketika nilai err adalah nil. Untuk informasi lebih lanjut, lihat CopyObjectResult.

err

error

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

Contoh

Berikut ini adalah kode contoh yang menunjukkan cara menyalin objek berukuran kurang dari 5 GiB dari bucket sumber ke bucket tujuan:

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

// 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()

	// 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)

	// 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.
	}

	// Salin objek sumber dan proses hasilnya.
	result, err := client.CopyObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal menyalin objek %v", err)
	}
	log.Printf("hasil penyalinan objek:%#v\n", result)
}

Referensi

  • Untuk kode contoh lengkap yang digunakan untuk menyalin objek, kunjungi GitHub.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk menyalin objek, lihat CopyObject.