オブジェクトをコピーする完全なコードについては、『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)
}
}