バケットから単一のオブジェクトをダウンロードする場合、最終変更時刻またはオブジェクトのETag (オブジェクトコンテンツの識別子) に基づいてダウンロード条件を指定できます。 指定されたダウンロード条件が満たされると、オブジェクトがダウンロードされます。 指定されたダウンロード条件が満たされない場合、エラーが返され、オブジェクトはダウンロードされません。 条件付きダウンロードを使用すると、ネットワーク伝送とリソース消費を削減し、ダウンロード効率を向上させることができます。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョン、エンドポイント、オープンポート」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
条件付きダウンロードを実行するには、
oss:GetObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。
条件
利用可能なオブジェクトのダウンロード条件を次の表に示します。
"If-Modified-Since" と "If-Unmodified-Since" の両方が、オブジェクトのダウンロード条件と同時に存在することがあります。 "If-Match" と "If-None-Match" の両方が、オブジェクトのダウンロード条件と同時に存在することがあります。
ossClient.getObjectMetaを使用してETagを取得できます。
パラメーター | 説明 | 設定方法 |
If-Modified-Since | 指定された時刻が、オブジェクトが最後に変更された時刻よりも早い場合、オブジェクトをダウンロードできます。 それ以外の場合、304 Not Modifiedが返されます。 | oss.IfModifiedSince |
If-Unmodified-Since | 指定された時刻が、オブジェクトが最後に変更された時刻以降の場合、オブジェクトをダウンロードできます。 そうでない場合、412 Precondition Failedが返されます。 | oss.IfUnmodifiedSince |
If-Match | 指定された ETag がオブジェクトのものと一致すれば、そのオブジェクトをダウンロードすることができます。 そうでない場合、412 Precondition Failedが返されます。 | oss.IfMatch |
If-None-Match | 指定された ETag がオブジェクトのものと一致しない場合は、オブジェクトをダウンロードできます。 それ以外の場合、304 Not Modifiedが返されます。 | oss.IfNoneMatch |
例
次のサンプルコードは、条件付きダウンロードの実行方法の例を示しています。
package main
import (
"fmt"
"os"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the name of your bucket.
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// For example, an object was last modified at 18:43:02, on November 21, 2023. If the specified time is earlier than the last modified time, the object meets the If-Modified-Since condition and the object is downloaded.
date := time.Date(2023, time.November, 21, 10, 40, 02, 0, time.UTC)
// The object is not downloaded if it does not meet the specified conditions.
// Specify the full path of the object. Do not include the bucket name in the full path.
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfUnmodifiedSince(date))
if err == nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// The object is downloaded if it meets the specified conditions.
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfModifiedSince(date))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}