從Bucket中下載單個檔案(Object)時,可以指定基於檔案的最後修改時間或者ETag(檔案內容的標識符)的限制條件。滿足限定條件則下載,不滿足限定條件則返回錯誤且不會觸發下載行為。使用限定條件下載可以減少網路傳輸和資源消耗,提高下載效率。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要限定條件下載,您必須有
oss:GetObject
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
限定條件
OSS支援的限定條件如下:
If-Modified-Since和If-Unmodified-Since可以同時存在。If-Match和If-None-Match也可以同時存在。
您可以通過ossClient.getObjectMeta方法擷取ETag。
參數 | 描述 | 如何設定 |
IfModifiedSince | 如果指定的時間早於實際修改時間,則正常傳輸檔案,否則返回錯誤(304 Not modified)。 | oss.IfModifiedSince |
IfUnmodifiedSince | 如果指定的時間等於或者晚於檔案實際修改時間,則正常傳輸檔案,否則返回錯誤(412 Precondition failed)。 | oss.IfUnmodifiedSince |
IfMatch | 如果指定的ETag和OSS檔案的ETag匹配,則正常傳輸檔案,否則返回錯誤(412 Precondition failed)。 | oss.IfMatch |
IfNoneMatch | 如果指定的ETag和OSS檔案的ETag不匹配,則正常傳輸檔案,否則返回錯誤(304 Not modified)。 | oss.IfNoneMatch |
範例程式碼
以下代碼用於限定條件下載。
package main
import (
"fmt"
"os"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填寫儲存空間名稱。
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 假設Object最後修改時間為2023年11月21日18:43:02,則填寫的UTC早於該時間時,將滿足IfModifiedSince的限定條件,並觸發下載行為。
date := time.Date(2023, time.November, 21, 10, 40, 02, 0, time.UTC)
// 不滿足限定條件,不下載檔案。
// yourObjectName填寫不包含Bucket名稱在內的Object的完整路徑。
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfUnmodifiedSince(date))
if err == nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 滿足限定條件,下載檔案。
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfModifiedSince(date))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}