バケットからファイル (オブジェクト) をダウンロードする際、最終更新時刻または ETag に基づいて条件を指定できます。ETag はファイルの内容の識別子です。ファイルは、指定された条件が満たされた場合にのみダウンロードされます。条件が満たされない場合、エラーが返され、ダウンロードはトリガーされません。この方法により、ネットワークトラフィックとリソース使用量が削減され、ダウンロード効率が向上します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
条件付きダウンロードを実行するには、
oss:GetObject権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
条件
OSS は次の条件をサポートしています。
`If-Modified-Since` と `If-Unmodified-Since` は併用できます。`If-Match` と `If-None-Match` も併用できます。
ETag を取得するには、`ossClient.getObjectMeta` メソッドを使用します。
パラメーター | 説明 | 設定方法 |
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 をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、必要に応じてエンドポイントを設定します。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、必要に応じてリージョンを設定します。
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)
}
// オブジェクトが 2023年11月21日 18:43:02 に最終更新されたと仮定します。指定された UTC 時刻がこの時刻より前の場合、IfModifiedSince 条件が満たされ、ダウンロードがトリガーされます。
date := time.Date(2023, time.November, 21, 10, 40, 02, 0, time.UTC)
// 条件は満たされません。ファイルはダウンロードされません。
// yourObjectName をオブジェクトのフルパスに設定します。フルパスにはバケット名は含まれません。
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)
}
}