オブジェクトをコピーする完全なコードについては、『GitHub』をご参照ください。

同じバケット内のオブジェクトのコピー

次のコードを実行して、同じバケット内のオブジェクトをコピーします。

package main

import (
	"fmt"
	"os"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Create an OSSClient instance.
	client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	bucketName := "<yourBucketName>"
	objectName := "<yourObjectName>"
	destObjectName := "<yourDestObjectName>"

	// Obtain the bucket.
	bucket, err := client.Bucket(bucketName)
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Copy an object to another object in the same bucket.
	_, err = bucket.CopyObject(objectName, destObjectName)
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

別のバケットへのオブジェクトのコピー

現在のバケットから別のバケットへ、または他のバケットから現在のバケットへオブジェクトをコピーできます。 次のコードを実行してオブジェクトを別のバケットにコピーします。

package main

import (
	"fmt"
	"os"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Create an OSSClient instance.
	client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	bucketName := "<yourBucketName>"
	srcBucketName := "<yourSrcBucketName>"
	dstBucketName := "<yourDstBucketName>"
	srcObjectName := "<yourSrcObjectName>"
	dstObjectName := "<yourDstObjectName>"

	// Obtain the bucket.
	bucket, err := client.Bucket(bucketName)
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Copy the source object (srcObjectName) from other buckets (srcBucketName) to the current bucket.
	bucket.CopyObjectFrom(srcBucketName, srcObjectName, dstObjectName)
	if err ! = nil {
		fmt.Println("CopyObjectFrom Error:", err)
		os.Exit(-1)
	}

	// Copy the source object (srcObjectName) from the current bucket to another bucket (dstBucketName).
	bucket.CopyObjectTo(dstBucketName, dstObjectName, srcObjectName)
	if err ! = nil {
		fmt.Println("CopyObjectTo Error:", err)
		os.Exit(-1)
	}
}
  • コピー中のオブジェクトメタデータの処理

    "MetadataDirective "パラメーターを指定して、オブジェクトをコピーするときにオブジェクトメタデータを処理します。

    • oss.MetaCopy: 既定値。ターゲットオブジェクトのメタデータがソース・オブジェクトのメタデータと同じであることを示し、ソースオブジェクトのメタデータをコピーすることを示します。
    • oss.MetaReplace: ソースオブジェクトのメタデータを新しいメタデータに置き換えます。
    重要 "MetadataDirective" パラメーターを oss.MetaReplace に指定した場合、ソースオブジェクトのメタデータは上書きされ、復元できません。 この操作は慎重に行ってください。

    "MetadataDirective "の値が oss.MetaReplace の場合、次のメタデータを指定できます。

    Metadata 説明
    CacheControl 新しいオブジェクトがダウンロードされたときの Web ページのキャッシュアクションを指定します。
    ContentDisposition ダウンロード時の新しいオブジェクトの名前を指定します。
    ContentEncoding 新しいオブジェクトがダウンロードされたときのコンテンツのエンコード形式を指定します。
    Expires 新しいオブジェクトの有効期限 (GMT) を指定します。
    ServerSideEncryption OSS がオブジェクトを作成するときに使用されるサーバー側の暗号化アルゴリズムを指定します。 有効値: AES256
    ObjectACL 作成時に OSS オブジェクトの ACL を指定します。
    Meta X-Oss-Meta- というプレフィックスが付いたカスタムパラメーターです。

    コピー中にオブジェクトのメタデータを処理するには、次のコードを実行します。

    package main
    
    import (
    	"fmt"
    	"os"
    	"time"
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// Create an OSSClient instance.
    	client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
    	if err ! = nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	bucketName := "<yourBucketName>"
    	objectName := "<yourObjectName>"
    	destObjectName := "<yourDestObjectName>"
    
    	// Obtain the bucket.
    	bucket, err := client.Bucket(bucketName)
    	if err ! = nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// Specify the metadata of the target object.
    	expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
    	options := []oss.Option{
    		oss.MetadataDirective(oss.MetaReplace),
    		oss.Expires(expires),
    		oss.ObjectACL(oss.ACLPublicRead),
    		oss.Meta("MyMeta", "MyMetaValue")}
    
    	// Overwrites the metadata of the source object with the specified metadata.
    	_, err = bucket.CopyObject(objectName, destObjectName, options...)
    	if err ! = nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    }
    

条件付きコピー

オブジェクトコピーの条件を設定できます。 オブジェクトは、条件が満たされたときにのみコピーされます。 それ以外の場合は、エラーが報告され、オブジェクトはコピーされません。 利用可能な条件は次のとおりです。

パラメーター 説明
CopySourceIfMatch ソースオブジェクトの ETag 値がユーザーによって提供された ETag と同じ場合、コピー操作が実行されます。 それ以外の場合は、エラーが返されます。
CopySourceIfNoneMatch ソースオブジェクトの ETag 値がユーザーによって提供された ETag と同じでない場合は、コピー操作が実行されます。 それ以外の場合は、エラーが返されます。
CopySourceIfModifiedSince 入力パラメーターで指定された時間がソースオブジェクトの実際の修正時間と同じかそれより遅い場合、オブジェクトは通常通りコピーされます。 それ以外の場合は、エラーが返されます。
CopySourceIfUnmodifiedSince ユーザーが指定した時間が経過してもソースオブジェクトが変更されている場合は、そのオブジェクトがコピーされます。 それ以外の場合は、エラーが返されます。

"CopySourceIfMatch" と "CopySourceIfNoneMatch" は同時に条件として使用できます。 "CopySourceIfModifiedSince" と "CopySourceIfUnmodifiedSince" は同時に条件として使用できます。

条件付きコピーには次のコードを実行します。

package main

import (
	"fmt"
	"os"
	"time"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Create an OSSClient instance.
	client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// bucketName := "<yourBucketName>"
	// objectName := "<yourObjectName>"
	bucketName := "<yourBucketName>"
	objectName := "<yourObjectName>"
	destMatchObjectName := "<yourMatchDestObjectName>"
	destUnMatchObjectName := "<yourUnmatchDestObjectName>"

	// Obtain the bucket.
	bucket, err := client.Bucket(bucketName)
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	date := time.Date(2011, time.November, 10, 23, 0, 0, 0, time.UTC)

	// The conditions are satisfied, copy the object.
	_, err = bucket.CopyObject(objectName, destMatchObjectName, oss.CopySourceIfModifiedSince(date))
	if err ! = nil {
		fmt.Println("CopyObject CopySourceIfModifiedSince Error:", err)
	}

	// The conditions are not met, the object is not copied.
	_, err = bucket.CopyObject(objectName, destUnMatchObjectName, oss.CopySourceIfUnmodifiedSince(date))
	if err ! = nil {
		fmt.Println("CopyObject CopySourceIfUnmodifiedSince Error:", err)
	}
}