このトピックでは、OSS SDK for Go を使用してファイルメタデータを設定および取得する方法について説明します。
注意事項
このトピックのサンプルコードでは、リージョン ID が
cn-hangzhouの中国 (杭州) リージョンを例として使用します。デフォルトでは、パブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、代わりに内部エンドポイントを使用してください。OSS リージョンとエンドポイントのマッピングの詳細については、「リージョンとエンドポイント」をご参照ください。このトピックでは、環境変数からアクセス資格情報を取得する方法の例を示します。アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
ファイルメタデータを設定するには、
oss:PutObject権限が必要です。ファイルメタデータを取得するには、oss:GetObject権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
ファイルのアップロード時にメタデータを設定する
ファイルのアップロード時にメタデータを設定する
次のサンプルコードは、PutObject 操作を呼び出してメタデータを設定する方法を示しています。ファイルの有効期限、ファイルのアクセス制御リスト (ACL) を公開読み取りに設定、またはファイルの目的やプロパティを識別するためのカスタムメタデータなどを設定できます。他のアップロード操作でも同じ方法でメタデータを設定できます。
package main
import (
"context"
"flag"
"log"
"strings"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // ストレージリージョン。
bucketName string // バケット名。
objectName string // オブジェクト名。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// アップロードするコンテンツを定義します。
content := "hi oss"
// デフォルトの構成をロードし、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// オブジェクトをアップロードするリクエストを作成します。
request := &oss.PutObjectRequest{
Bucket: oss.Ptr(bucketName), // バケット名。
Key: oss.Ptr(objectName), // オブジェクト名。
Body: strings.NewReader(content), // アップロードするコンテンツ。
Expires: oss.Ptr(time.Date(2038, 12, 31, 12, 0, 0, 0, time.UTC).Format(time.RFC1123)), // オブジェクトの有効期限。
Acl: oss.ObjectACLPublicRead,
Metadata: map[string]string{ // カスタムメタデータ。
"Author": "alibaba oss sdk", // オブジェクトの作成者。
"Date": "2024-07-01", // オブジェクトの作成日。
},
}
// オブジェクトをアップロードするリクエストを送信します。
result, err := client.PutObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put object %v", err)
}
// オブジェクトのアップロード結果を出力します。
log.Printf("put object result:%#v\n", result)
}
ファイルメタデータの取得
HeadObject メソッドを使用してオブジェクトのすべてのメタデータを取得する
次のサンプルコードを使用して HeadObject メソッドを呼び出し、指定したオブジェクトのすべてのメタデータを取得できます。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // ストレージリージョン。
bucketName string // バケット名。
objectName string // オブジェクト名。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// デフォルトの構成をロードし、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// HeadObject リクエストを作成します。
request := &oss.HeadObjectRequest{
Bucket: oss.Ptr(bucketName), // バケット名。
Key: oss.Ptr(objectName), // オブジェクト名。
}
// HeadObject 操作を実行し、結果を処理します。
result, err := client.HeadObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to head object %v", err)
}
// HeadObject 操作の結果を出力します。
log.Printf("head object result:%#v\n", result)
}
GetObjectMeta メソッドを使用してオブジェクトの部分的なメタデータを取得する
GetObjectMeta メソッドを呼び出して、オブジェクトのメタデータのサブセット (コンテンツの長さ (ContentLength)、ETag、最終更新日時 (LastModified)、最終アクセス日時 (LastAccessTime)、バージョン ID (VersionId)、オブジェクトの 64 ビット CRC 値 (HashCRC64) など) のみを取得できます。
次のサンプルコードを使用して GetObjectMeta メソッドを呼び出し、指定したオブジェクトの部分的なメタデータを取得できます。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // ストレージリージョン。
bucketName string // バケット名。
objectName string // オブジェクト名。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// デフォルトの構成をロードし、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// オブジェクトメタデータを取得するリクエストを作成します。
request := &oss.GetObjectMetaRequest{
Bucket: oss.Ptr(bucketName), // バケット名。
Key: oss.Ptr(objectName), // オブジェクト名。
}
// オブジェクトメタデータを取得する操作を実行し、結果を処理します。
result, err := client.GetObjectMeta(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get object meta %v", err)
}
// オブジェクトメタデータの取得結果を出力します。
log.Printf("get object meta result:%#v\n", result)
}
既存のファイルのメタデータを変更する
CopyObject メソッドを使用してオブジェクトのメタデータを変更する
次のサンプルコードは、CopyObject メソッドを呼び出して、コピー操作中に宛先オブジェクトのメタデータを設定する方法を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // ストレージリージョン。
srcBucketName string // ソースバケット名。
srcObjectName string // ソースオブジェクト名。
destBucketName string // 宛先バケット名。
destObjectName string // 宛先オブジェクト名。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// ソースバケット名が空かどうかを確認します。
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, source bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 宛先バケット名が指定されていない場合は、ソースバケット名が使用されます。
if len(destBucketName) == 0 {
destBucketName = srcBucketName
}
// ソースオブジェクト名が空かどうかを確認します。
if len(srcObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, source object name required")
}
// 宛先オブジェクト名が空かどうかを確認します。
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, destination object name required")
}
// デフォルトの構成をロードし、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// メタデータを作成します。
metaData := map[string]string{
"x-oss-meta-tag1": "value1", // メタデータキーは x-oss-meta-tag1 で、値は value1 です。
"x-oss-meta-tag2": "value2", // メタデータキーは x-oss-meta-tag2 で、値は value2 です。
}
// オブジェクトをコピーするリクエストを作成します。
copyRequest := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // 宛先バケット名。
Key: oss.Ptr(destObjectName), // 宛先オブジェクト名。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクト名。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケット名。
Metadata: metaData, // 宛先オブジェクトのメタデータを指定します。
MetadataDirective: oss.Ptr("Replace"), // ソースオブジェクトのメタデータをコピーしません。
}
// オブジェクトのコピー操作を実行し、結果を処理します。
copyResult, err := client.CopyObject(context.TODO(), copyRequest)
if err != nil {
log.Fatalf("failed to copy object: %v", err)
}
log.Printf("copy object result versionId:%#v\n", copyResult)
}
コピーマネージャーの Copier.Copy メソッドを使用してオブジェクトのメタデータを変更する
次のサンプルコードは、コピーマネージャーの Copier.Copy メソッドを呼び出して、ソースオブジェクトをコピーするときに宛先オブジェクトのメタデータを設定する方法を示しています。元のメタデータを置き換えたり、元のメタデータをクリアしたり、元のメタデータの一部を更新したりできます。コピー操作が完了したら、ソースオブジェクトを削除するかどうかを選択できます。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // ストレージリージョン。
srcBucketName string // ソースバケット名。
srcObjectName string // ソースオブジェクト名。
destBucketName string // 宛先バケット名。
destObjectName string // 宛先オブジェクト名。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// ソースバケット名が空かどうかを確認します。
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// ストレージリージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 宛先バケット名が指定されていない場合は、ソースバケット名が使用されます。
if len(destBucketName) == 0 {
destBucketName = srcBucketName
}
// ソースオブジェクト名が空かどうかを確認します。
if len(srcObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, src object name required")
}
// 宛先オブジェクト名が空かどうかを確認します。
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, destination object name required")
}
// OSS クライアントを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// ファイルコピー機を作成します。
c := client.NewCopier()
// 宛先オブジェクトのメタデータを設定します。
metaData := map[string]string{
"x-oss-meta-tag1": "value1",
"x-oss-meta-tag2": "value2",
}
// オブジェクトをコピーするリクエストを作成します。
copyRequest := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // 宛先バケット名。
Key: oss.Ptr(destObjectName), // 宛先オブジェクト名。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクト名。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケット名。
Metadata: metaData, // 宛先オブジェクトのメタデータを指定します。
MetadataDirective: oss.Ptr("Replace"), // ソースオブジェクトのメタデータをコピーしません。
}
// オブジェクトのコピー操作を実行します。
result, err := c.Copy(context.TODO(), copyRequest)
if err != nil {
log.Fatalf("failed to copy object %v", err) // コピーに失敗した場合は、エラーをログに記録して終了します。
}
// オブジェクトを削除するリクエストを作成します。
deleteRequest := &oss.DeleteObjectRequest{
Bucket: oss.Ptr(srcBucketName), // バケット名。
Key: oss.Ptr(srcObjectName), // 削除するオブジェクトの名前。
}
// オブジェクトの削除操作を実行します。
deleteResult, err := client.DeleteObject(context.TODO(), deleteRequest)
if err != nil {
log.Fatalf("failed to delete multiple objects %v", err)
}
// オブジェクトのコピー操作の結果を出力します。
log.Printf("copy object result:%#v\n", result)
// オブジェクトの削除操作の結果を出力します。
log.Printf("delete objects result:%#v\n", deleteResult)
}