OSS は、オブジェクトの直接的な名前変更をサポートしていません。 同じバケット内のオブジェクトの名前を変更するには、CopyObject API 操作を呼び出してソースオブジェクトを宛先オブジェクトにコピーし、次に DeleteObject API 操作を呼び出してソースオブジェクトを削除します。
使用上の注意
このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID として
cn-hangzhouを使用しています。 デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。 同じリージョン内の他の Alibaba Cloud サービスからバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。 詳細については、「OSS のリージョンとエンドポイント」をご参照ください。このトピックのサンプルコードは、環境変数からアクセス資格情報を読み取ります。 詳細については、「アクセス資格情報の設定」をご参照ください。
サンプルコード
簡易コピー (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)
// オブジェクトをコピーするリクエストを作成します。
copyRequest := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // 宛先バケットの名前。
Key: oss.Ptr(destObjectName), // 宛先オブジェクトの名前。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクトの名前。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケットの名前。
StorageClass: oss.StorageClassStandard, // ストレージクラスを Standard に設定します。
}
// オブジェクトのコピー操作を実行し、結果を処理します。
copyResult, err := client.CopyObject(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", copyResult)
// 削除操作の結果を出力します。
log.Printf("delete objects result:%#v\n", deleteResult)
}
コピー機能を使用したオブジェクトの名前変更
次のコードは、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()
// オブジェクトをコピーするリクエストを作成します。
copyRequest := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // 宛先バケットの名前。
Key: oss.Ptr(destObjectName), // 宛先オブジェクトの名前。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクトの名前。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケットの名前。
StorageClass: oss.StorageClassStandard, // ストレージクラスを Archive として指定します。
}
// オブジェクトのコピー操作を実行します。
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)
}
関連情報
コピー機能を使用してオブジェクトの名前を変更する API 操作の詳細については、「Copier.Copy」をご参照ください。
簡易コピーメソッドを使用してオブジェクトの名前を変更する API 操作の詳細については、「CopyObject」をご参照ください。