Saat mengunduh file (objek) dari bucket, Anda dapat menetapkan kondisi berdasarkan waktu modifikasi terakhir atau ETag-nya. ETag merupakan pengidentifikasi konten file tersebut. File hanya akan diunduh jika kondisi yang ditentukan terpenuhi; jika tidak, sistem akan mengembalikan error dan unduhan tidak dilakukan. Pendekatan ini mengurangi lalu lintas jaringan dan penggunaan sumber daya, sehingga meningkatkan efisiensi unduhan.
Catatan penggunaan
Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lain yang berada di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.
Kredensial akses pada topik ini diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.
Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Konfigurasi klien (Go SDK V1).
Untuk melakukan unduhan bersyarat, Anda harus memiliki izin
oss:GetObject. Untuk informasi selengkapnya, lihat Berikan izin kustom kepada RAM user.
Kondisi
OSS mendukung kondisi berikut:
If-Modified-Since dan If-Unmodified-Since dapat digunakan secara bersamaan. If-Match dan If-None-Match juga dapat digunakan secara bersamaan.
Untuk mengambil ETag, gunakan metode ossClient.getObjectMeta.
Parameter | Deskripsi | Cara mengatur |
IfModifiedSince | Jika waktu yang ditentukan lebih awal daripada waktu modifikasi aktual file, file akan ditransfer. Jika tidak, error 304 Not Modified dikembalikan. | oss.IfModifiedSince |
IfUnmodifiedSince | Jika waktu yang ditentukan sama dengan atau lebih baru daripada waktu modifikasi aktual file, file akan ditransfer. Jika tidak, error 412 Precondition Failed dikembalikan. | oss.IfUnmodifiedSince |
IfMatch | Jika ETag yang ditentukan sesuai dengan ETag file di OSS, file akan ditransfer. Jika tidak, error 412 Precondition Failed dikembalikan. | oss.IfMatch |
IfNoneMatch | Jika ETag yang ditentukan tidak sesuai dengan ETag file di OSS, file akan ditransfer. Jika tidak, error 304 Not Modified dikembalikan. | oss.IfNoneMatch |
Kode contoh
Kode berikut menunjukkan cara melakukan unduhan bersyarat.
package main
import (
"fmt"
"os"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh 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 Endpoint bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Endpoint-nya.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan nilainya.
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 yourBucketName ke nama bucket.
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Asumsikan objek terakhir dimodifikasi pada pukul 18:43:02, 21 November 2023. Jika waktu UTC yang ditentukan lebih awal dari waktu ini, kondisi IfModifiedSince terpenuhi dan unduhan dilakukan.
date := time.Date(2023, time.November, 21, 10, 40, 02, 0, time.UTC)
// Kondisi tidak terpenuhi. File tidak diunduh.
// Setel yourObjectName ke path lengkap objek. Path lengkap tidak mencakup nama bucket.
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfUnmodifiedSince(date))
if err == nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Kondisi terpenuhi. File diunduh.
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfModifiedSince(date))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
Referensi
Untuk kode contoh lengkap mengenai unduhan bersyarat, lihat contoh di GitHub.
Untuk informasi selengkapnya mengenai operasi API untuk unduhan bersyarat, lihat GetObject.