Topik ini menjelaskan cara menggunakan OSS SDK untuk Go dalam mengatur dan memperoleh metadata file.
Perhatian
Kode contoh dalam topik ini menggunakan Wilayah Tiongkok (Hangzhou) dengan ID wilayah
cn-hangzhousebagai contoh. Secara default, Titik akhir publik digunakan. Untuk mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan Titik akhir internal. Untuk informasi lebih lanjut tentang pemetaan antara wilayah OSS dan titik akhir, lihat Wilayah dan Titik Akhir.Topik ini memberikan contoh cara memperoleh kredensial akses dari variabel lingkungan. Untuk informasi lebih lanjut tentang konfigurasi kredensial akses, lihat Konfigurasikan Kredensial Akses.
Untuk mengatur metadata file, Anda memerlukan izin
oss:PutObject. Untuk memperoleh metadata file, Anda memerlukan izinoss:GetObject. Untuk informasi lebih lanjut, lihat Berikan Izin Khusus kepada Pengguna RAM.
Atur metadata saat mengunggah file
Atur metadata saat mengunggah file
Contoh kode berikut menunjukkan cara mengatur metadata dengan memanggil operasi PutObject. Anda dapat mengatur metadata seperti waktu kedaluwarsa file, daftar kontrol akses (ACL) file ke baca-publik, atau metadata kustom untuk mengidentifikasi tujuan atau properti file. Metode yang sama dapat digunakan untuk mengatur metadata pada operasi unggah lainnya.
package main
import (
"context"
"flag"
"log"
"strings"
"time"
"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 penyimpanan.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Parsing parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 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")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama objek diperlukan")
}
// Tentukan konten untuk diunggah.
content := "hi oss"
// Muat konfigurasi default dan atur penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat permintaan untuk mengunggah objek.
request := &oss.PutObjectRequest{
Bucket: oss.Ptr(bucketName), // Nama bucket.
Key: oss.Ptr(objectName), // Nama objek.
Body: strings.NewReader(content), // Konten untuk diunggah.
Expires: oss.Ptr(time.Date(2038, 12, 31, 12, 0, 0, 0, time.UTC).Format(time.RFC1123)), // Waktu kedaluwarsa objek.
Acl: oss.ObjectACLPublicRead,
Metadata: map[string]string{ // Metadata kustom.
"Author": "alibaba oss sdk", // Penulis objek.
"Date": "2024-07-01", // Tanggal pembuatan objek.
},
}
// Kirim permintaan untuk mengunggah objek.
result, err := client.PutObject(context.TODO(), request)
if err != nil {
log.Fatalf("gagal mengunggah objek %v", err)
}
// Cetak hasil pengunggahan objek.
log.Printf("hasil unggah objek:%#v\n", result)
}
Memperoleh metadata file
Gunakan metode HeadObject untuk memperoleh semua metadata objek
Anda dapat menggunakan contoh kode berikut untuk memanggil metode HeadObject guna memperoleh semua metadata objek yang ditentukan.
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 penyimpanan.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Parsing parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 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")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama objek diperlukan")
}
// Muat konfigurasi default dan atur penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat permintaan HeadObject.
request := &oss.HeadObjectRequest{
Bucket: oss.Ptr(bucketName), // Nama bucket.
Key: oss.Ptr(objectName), // Nama objek.
}
// Eksekusi operasi HeadObject dan proses hasilnya.
result, err := client.HeadObject(context.TODO(), request)
if err != nil {
log.Fatalf("gagal melakukan head object %v", err)
}
// Cetak hasil operasi HeadObject.
log.Printf("hasil head object:%#v\n", result)
}
Gunakan metode GetObjectMeta untuk memperoleh sebagian metadata objek
Anda dapat memanggil metode GetObjectMeta untuk memperoleh sebagian metadata objek, seperti panjang konten (ContentLength), ETag, waktu modifikasi terakhir (LastModified), waktu akses terakhir (LastAccessTime), ID versi (VersionId), dan nilai CRC 64-bit (HashCRC64) objek tersebut.
Anda dapat menggunakan contoh kode berikut untuk memanggil metode GetObjectMeta guna memperoleh sebagian metadata objek yang ditentukan.
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 penyimpanan.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Parsing parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 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")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama objek diperlukan")
}
// Muat konfigurasi default dan atur penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat permintaan untuk memperoleh metadata objek.
request := &oss.GetObjectMetaRequest{
Bucket: oss.Ptr(bucketName), // Nama bucket.
Key: oss.Ptr(objectName), // Nama objek.
}
// Eksekusi operasi untuk memperoleh metadata objek dan proses hasilnya.
result, err := client.GetObjectMeta(context.TODO(), request)
if err != nil {
log.Fatalf("gagal memperoleh metadata objek %v", err)
}
// Cetak hasil memperoleh metadata objek.
log.Printf("hasil memperoleh metadata objek:%#v\n", result)
}
Modifikasi metadata file yang ada
Gunakan metode CopyObject untuk mengubah metadata objek
Contoh kode berikut menunjukkan cara memanggil metode CopyObject untuk mengatur metadata objek tujuan selama operasi salin.
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 penyimpanan.
srcBucketName string // Nama bucket sumber.
srcObjectName string // Nama objek sumber.
destBucketName string // Nama bucket tujuan.
destObjectName string // Nama objek tujuan.
)
// Fungsi init 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()
// 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 akan 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 atur penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat metadata.
metaData := map[string]string{
"x-oss-meta-tag1": "value1", // Kunci metadata adalah x-oss-meta-tag1, dan nilainya adalah value1.
"x-oss-meta-tag2": "value2", // Kunci metadata adalah x-oss-meta-tag2, dan nilainya adalah value2.
}
// Buat permintaan untuk menyalin objek.
copyRequest := &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.
Metadata: metaData, // Tentukan metadata objek tujuan.
MetadataDirective: oss.Ptr("Replace"), // Jangan salin metadata objek sumber.
}
// Eksekusi operasi salin objek dan proses hasilnya.
copyResult, err := client.CopyObject(context.TODO(), copyRequest)
if err != nil {
log.Fatalf("gagal menyalin objek: %v", err)
}
log.Printf("hasil salin objek versionId:%#v\n", copyResult)
}
Gunakan metode Copier.Copy dari pengelola salinan untuk memodifikasi metadata objek
Contoh kode berikut menunjukkan cara memanggil metode Copier.Copy dari pengelola salinan untuk mengatur metadata objek tujuan saat menyalin objek sumber. Anda dapat mengganti metadata asli, menghapus metadata asli, atau memperbarui sebagian metadata asli. Setelah operasi salin selesai, Anda dapat memilih apakah akan menghapus objek sumber.
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 penyimpanan.
srcBucketName string // Nama bucket sumber.
srcObjectName string // Nama objek sumber.
destBucketName string // Nama bucket tujuan.
destObjectName string // Nama objek tujuan.
)
// Fungsi init 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()
// Periksa apakah nama bucket sumber kosong.
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama bucket diperlukan")
}
// Periksa apakah wilayah penyimpanan kosong.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, wilayah diperlukan")
}
// Jika nama bucket tujuan tidak ditentukan, nama bucket sumber akan 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")
}
// Konfigurasikan klien OSS.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat pengelola salinan file.
c := client.NewCopier()
// Atur metadata objek tujuan.
metaData := map[string]string{
"x-oss-meta-tag1": "value1",
"x-oss-meta-tag2": "value2",
}
// Bangun permintaan untuk menyalin objek.
copyRequest := &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.
Metadata: metaData, // Tentukan metadata objek tujuan.
MetadataDirective: oss.Ptr("Replace"), // Jangan salin metadata objek sumber.
}
// Eksekusi operasi salin objek.
result, err := c.Copy(context.TODO(), copyRequest)
if err != nil {
log.Fatalf("gagal menyalin objek %v", err) // Jika salin gagal, log kesalahan dan keluar.
}
// Bangun permintaan untuk menghapus objek.
deleteRequest := &oss.DeleteObjectRequest{
Bucket: oss.Ptr(srcBucketName), // Nama bucket.
Key: oss.Ptr(srcObjectName), // Nama objek yang akan dihapus.
}
// Eksekusi operasi hapus objek.
deleteResult, err := client.DeleteObject(context.TODO(), deleteRequest)
if err != nil {
log.Fatalf("gagal menghapus beberapa objek %v", err)
}
// Cetak hasil operasi salin objek.
log.Printf("hasil salin objek:%#v\n", result)
// Cetak hasil operasi hapus objek.
log.Printf("hasil hapus objek:%#v\n", deleteResult)
}