このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットとターゲットバケットに保持ポリシーが設定されていないことを確認します。 それ以外の場合、エラーメッセージ指定したオブジェクトは不変です。 が返されます。
ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。
小さなオブジェクトをコピーする
CopyObject
を呼び出して、バケット内または同じリージョン内のバケット間でオブジェクトをコピーできます。 1 GB未満のサイズのオブジェクトをコピーするには、CopyObjectを呼び出すことを推奨します。
同じバケット内のオブジェクトのコピー
次のコードは、同じバケット内のオブジェクトをコピーする方法の例を示しています。
パッケージメイン
import (import (import)
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
「時間」
)
func main() {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの名前を指定します。 例: examplebucket.
bucketName := "examplebucket"
// ソースオブジェクトのフルパスを指定します。 例: srcdir/srcobject.jpg
objectName := "srcdir/srcobject.jpg"
// 宛先オブジェクトのフルパスを指定します。 例: destdir/destobject.jpg
destObjectName := "destdir/destobject.jpg"
// バケット情報を取得します。
bucket, err := client.Bucket(bucketName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 宛先オブジェクトのメタデータを指定します。
expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
tag1 := oss.Tag {
キー: "a" 、
値: "1" 、
}
taggingInfo := oss.Tagging {
タグ: []oss.Tag{tag1},
}
options := []oss.Option{
oss.MetadataDirective(oss.MetaReplace),
oss.Expires(expires),
oss.SetTagging(taggingInfo),
// ソースオブジェクトのタグをターゲットオブジェクトにコピーします。
// oss.TaggingDirective(oss.TaggingCopy) 、
// OSSが宛先オブジェクトを作成するときに、宛先オブジェクトのアクセス制御リスト (ACL) をprivateに設定します。
// oss.ObjectACL(oss. ACLDrivate) 、
// key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK) を指定します。 このパラメーターは、x-oss-server-side-encryptionがKMSに設定されている場合にのみ有効です。
// oss.ServerSideEncryptionKeyID("9468da86-3509-4f8d-a61e-6eab1eac ****") 、
// OSSがオブジェクトを作成するときに、ターゲットオブジェクトの暗号化に使用されるサーバー側の暗号化アルゴリズムを指定します。
// oss.ServerSideEncryption("AES256") 、
// ソースオブジェクトのメタデータを宛先オブジェクトにコピーします。
// oss.MetadataDirective(oss.MetaCopy) 、
// CopyObject操作で、ソースバケットと同じ名前のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。 値trueは、操作がソースバケットと同じ名前のオブジェクトを上書きしないことを示します。
// oss.ForbidOverWrite(true) 、
// リクエストで指定したETag値がソースオブジェクトのETag値と同じ場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfMatch("5B3C1A2E053D763E1B002CC607C5 ****") 、
// リクエストで指定したETag値がソースオブジェクトのETag値と異なる場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfNoneMatch("5B3C1A2E053D763E1B002CC607C5 ****") 、
// リクエストで指定された時間が、オブジェクトが変更された実際の時間よりも早い場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfModifiedSince(2021-12-09T07:01:56.000Z) 、
// リクエストで指定された時間がオブジェクトの変更時間と同じかそれ以降の場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfUnmodifiedSince(2021-12-09T07:01:56.000Z) 、
// 宛先オブジェクトのストレージクラスを指定します。 この例では、ストレージクラスはStandardに設定されています。
// oss.StorageClass("Standard") 、
}
// リクエストで指定したメタデータを使用して、ソースオブジェクトのメタデータを上書きします。
_, err = bucket.CopyObject(objectName, destObjectName, options...)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
同じリージョンのバケット間でオブジェクトをコピーする
次のコードは、同じリージョンのバケット間でオブジェクトをコピーする方法の例を示しています。
パッケージメイン
import (
"fmt"
"os"
"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)
}
// Create an OSSClient instance.
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ソースバケットの名前を指定します。 例: srcbucket.
srcBucketName := "srcbucket"
// ソースオブジェクトのフルパスを指定します。 例: srcobject.jpg。
srcObjectName := "srcobject.jpg"
// 宛先オブジェクトのフルパスを指定します。 例: destobject.jpg。
dstObjectName := "destobject.jpg"
// 宛先バケットの名前を指定します。 例: destbucket。
destBucketName := "destbucket"
bucket, err := client.Bucket(destBucketName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// srcbucketバケットからdestbucketバケット内のdestobject.jpgオブジェクトにsrcobject.jpgオブジェクトをコピーします。
_, err = bucket.CopyObjectFrom(srcBucketName, srcObjectName, dstObjectName)
if err! =nil {
fmt.Println("CopyObjectFrom Error:", err)
os.Exit(-1)
}
}
大きなオブジェクトをコピーする
次のコードは、ラージオブジェクトをコピーする方法の例を示しています。
パッケージメイン
import (import (import)
"fmt"
"os"
「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)
}
// Create an OSSClient instance.
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの名前を指定します。 例: examplebucket.
bucketName := "examplebucket"
// バケット情報を取得します。
bucket, err := client.Bucket(bucketName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ソースオブジェクトのフルパスを指定します。 例: srcobject.txt。
objectSrc := "srcobject.txt"
// 宛先オブジェクトのフルパスを指定します。 例: destobject.txt。
objectDest := "destobject.txt"
// ローカルファイルのフルパスを指定します。
var fileName = "D :\\ localpath\\examplefile.txt"
chunks, err := oss.SplitFileByPartNum(fileName, 3)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
err = bucket.PutObjectFromFile(objectSrc, fileName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
imur, err := bucket.InitiateMultipartUpload(objectDest)
var parts []oss.UploadPart
for _, chunk := range chunks {
// リクエストで指定したメタデータを使用して、ソースオブジェクトのメタデータを上書きします。
options := []oss.Option{
// コピーするデータの範囲を指定します。 たとえば、コピーするデータの範囲として0 ~ 1023を指定した場合、ソースオブジェクトの最初の1024バイトがコピーされます。
// oss.CopySourceRange(0,1023) 、
// リクエストで指定したETag値がソースオブジェクトのETag値と同じ場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfMatch("5B3C1A2E053D763E1B002CC607C5 ****") 、
// リクエストで指定したETag値がソースオブジェクトのETag値と異なる場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfNoneMatch("5B3C1A2E053D763E1B002CC607C5 ****") 、
// リクエストで指定された時間がオブジェクトの変更時間と同じかそれ以降の場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfModifiedSince(2021-12-09T07:01:56.000Z) 、
// リクエストで指定された時間が、オブジェクトが変更された実際の時間よりも早い場合、OSSはオブジェクトをコピーしてOK 200を返します。
// oss.CopySourceIfUnmodifiedSince(2021-12-09T07:01:56.000Z) 、
}
part, err := bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, chunk.Number ,options...)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
parts = append(parts, part)
}
cmur, err := bucket.CompleteMultipartUpload(imur, parts)
fmt.Println("cmur:", cmur)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
参考資料
オブジェクトのコピーに使用される完全なサンプルコードについては、『GitHub』をご参照ください。
小さなオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「CopyObject」をご参照ください。
ラージオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「UploadPartCopy」をご参照ください。