Topik ini menjelaskan cara mengunggah objek ke bucket yang telah diaktifkan fitur versioning.
Catatan penggunaan
Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya yang berada di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Regions and endpoints.
Kredensial akses pada topik ini diperoleh dari variabel lingkungan. Untuk informasi selengkapnya mengenai cara mengonfigurasi kredensial akses, lihat Configure access credentials.
Instans OSSClient pada topik ini dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Configure a client (Go SDK V1).
Untuk mengunggah file, Anda harus memiliki izin
oss:PutObject. Untuk informasi selengkapnya, lihat Grant custom access policies to RAM users.
Contoh kode
Simple upload
Pada bucket yang telah diaktifkan fitur versioning, OSS secara otomatis menghasilkan ID versi unik untuk setiap objek baru. ID tersebut dikembalikan dalam bidang x-oss-version-id pada header respons. Pada bucket yang fitur versioning-nya ditangguhkan, ID versi objek baru adalah "null". Jika Anda mengunggah objek dengan nama yang sama, objek baru akan menimpa objek sebelumnya. OSS memastikan hanya satu versi objek yang memiliki ID versi "null".
Kode berikut menunjukkan cara melakukan simple upload:
package main
import (
"log"
"net/http"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk informasi mengenai wilayah lainnya, lihat dokumentasi resmi.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk informasi mengenai wilayah lainnya, lihat dokumentasi resmi.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat klien OSS: %v", err)
}
// Setel bucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
var retHeader http.Header
// Unggah string. Gunakan oss.GetResponseHeader untuk mendapatkan header respons.
// Setel objectName ke path lengkap objek. Jangan sertakan nama bucket.
objectName := "yourObjectName"
objectValue := "yourObjectValue"
err = bucket.PutObject(objectName, strings.NewReader(objectValue), oss.GetResponseHeader(&retHeader))
if err != nil {
log.Fatalf("Gagal mengunggah objek '%s': %v", objectName, err)
}
// Cetak x-oss-version-id.
versionId := oss.GetVersionId(retHeader)
log.Printf("x-oss-version-id: %s", versionId)
}
Append upload
Pada bucket yang telah diaktifkan fitur versioning, Anda hanya dapat melakukan operasi AppendObject pada versi terkini dari objek yang dapat ditambahkan, bukan pada versi historis.
Saat Anda memanggil operasi AppendObject pada versi terkini dari objek yang dapat ditambahkan, OSS tidak membuat versi sebelumnya untuk objek tersebut.
Saat Anda memanggil operasi PutObject atau DeleteObject pada versi terkini dari objek yang dapat ditambahkan, OSS menyimpan objek tersebut sebagai versi sebelumnya. Anda tidak dapat lagi menambahkan data ke objek ini.
Anda tidak dapat memanggil operasi AppendObject pada versi terkini objek yang tidak dapat ditambahkan, seperti objek biasa atau penanda hapus.
Kode berikut menunjukkan cara melakukan append upload:
package main
import (
"log"
"net/http"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk informasi mengenai wilayah lainnya, lihat dokumentasi resmi.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk informasi mengenai wilayah lainnya, lihat dokumentasi resmi.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat klien OSS: %v", err)
}
// Setel bucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
// Posisi untuk operasi append pertama adalah 0. Nilai kembali menunjukkan posisi untuk operasi append berikutnya. Posisi untuk operasi append selanjutnya adalah panjang file sebelum operasi append.
// Setel objectName ke path lengkap objek. Jangan sertakan nama bucket.
objectName := "yourObjectName"
var retHeader http.Header
var nextPos int64 = 0
// Lakukan operasi append pertama.
nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue1"), nextPos, oss.GetResponseHeader(&retHeader))
if err != nil {
log.Fatalf("Gagal menambahkan objek '%s': %v", objectName, err)
}
log.Printf("x-oss-version-id: %s", retHeader.Get("x-oss-version-id"))
// Lakukan operasi append kedua.
nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue2"), nextPos, oss.GetResponseHeader(&retHeader))
if err != nil {
log.Fatalf("Gagal menambahkan objek '%s': %v", objectName, err)
}
log.Printf("x-oss-version-id: %s", oss.GetVersionId(retHeader))
// Anda dapat melakukan beberapa operasi append.
}
Multipart upload
Saat Anda memanggil operasi CompleteMultipartUpload untuk objek di bucket yang telah diaktifkan fitur versioning, OSS menghasilkan ID versi unik untuk objek tersebut. ID versi ini dikembalikan dalam header respons x-oss-version-id.
Kode berikut menunjukkan cara melakukan multipart upload:
package main
import (
"fmt"
"net/http"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke titik akhir bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk informasi mengenai wilayah lainnya, lihat dokumentasi resmi.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk informasi mengenai wilayah lainnya, lihat dokumentasi resmi.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Setel nama bucket.
bucketName := "examplebucket"
// Setel path lengkap objek. Jangan sertakan nama bucket dalam path lengkap.
objectName := "exampleobject.txt"
// Setel path lengkap file lokal. Jika Anda tidak menentukan path lokal, file akan diunggah dari path lokal proyek.
locaFilename := "D:\\localpath\\examplefile.txt"
// Gunakan oss.GetResponseHeader untuk mendapatkan header respons.
var retHeader http.Header
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
chunks, err := oss.SplitFileByPartNum(locaFilename, 3)
fd, err := os.Open(locaFilename)
defer fd.Close()
// Langkah 1: Mulai tugas unggah multi-bagian.
imur, err := bucket.InitiateMultipartUpload(objectName)
// Langkah 2: Unggah bagian-bagian.
var parts []oss.UploadPart
for _, chunk := range chunks {
fd.Seek(chunk.Offset, os.SEEK_SET)
// Panggil metode UploadPart untuk mengunggah setiap bagian.
part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
parts = append(parts, part)
}
// Langkah 3: Selesaikan unggah multi-bagian.
cmur, err := bucket.CompleteMultipartUpload(imur, parts, oss.GetResponseHeader(&retHeader))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("cmur:", cmur)
// Cetak x-oss-version-id.
fmt.Println("x-oss-version-id:", oss.GetVersionId(retHeader))
}
Referensi
Untuk informasi selengkapnya mengenai operasi simple upload, lihat PutObject.
Untuk informasi selengkapnya mengenai operasi append upload, lihat AppendObject.
Untuk informasi selengkapnya mengenai operasi API untuk menyelesaikan unggah multi-bagian, lihat CompleteMultipartUpload.