このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。
使用上の注意
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケット内のオブジェクトを、中国 (青島) リージョンにある別のバケットにコピーすることはできません。
コピーするオブジェクトのサイズは1 GBを超えることはできません。
このトピックのサンプルコードを実行する前に、カスタムドメイン名やSecurity Token Service (STS) などの方法を使用してOSSClientインスタンスを作成する必要があります。 詳細については、「初期化」をご参照ください。
例
次のサンプルコードは、オブジェクトをコピーする方法の例を示しています。
// ソースバケットの名前を指定します。
文字列srcBucketName = "srcbucket";
// ソースオブジェクトのフルパスを指定します。
文字列srcObjectKey = "dir1/srcobject.txt";
// 宛先バケットの名前を指定します。 宛先バケットは、ソースバケットと同じリージョンに配置する必要があります。
文字列destBucketName = "destbucket";
// 宛先オブジェクトのフルパスを指定します。
文字列destObjectKey = "dir2/destobject.txt";
// オブジェクトをコピーするリクエストを作成します。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);
// ObjectMetadata objectMetadata=新しいObjectMetadata();
// オブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、ACLはprivateに設定されています。
// objectMetadata.setHeader("x-oss-object-acl", "private");
// オブジェクトのストレージクラスを指定します。 この例では、ストレージクラスはStandardに設定されています。
// objectMetadata.setHeader("x-oss-storage-class", "Standard");
// 同じ名前の既存のオブジェクトをCopyObject操作で上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。これは、CopyObject操作が同じ名前の既存のオブジェクトを上書きしないことを指定します。
// objectMetadata.setHeader("x-oss-forbid-overwrite", "true");
// ソースオブジェクトのETag値がリクエストで指定されたETag値と同じ場合、OSSはオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-match", "5B3C1A2E053D763E1B002CC607C5 ****");
// ソースオブジェクトのパスを指定します。
// objectMetadata.setHeader("x-oss-copy-source", "/examplebucket/recode-test.txt");
// ソースオブジェクトのETag値がリクエストで指定されたETag値と異なる場合、OSSはオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-none-match", "5B3C1A2E053D763E1B002CC607C5 ****");
// リクエストで指定された時間が、オブジェクトが変更された時間以降の場合、OSSはオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-unmodified-since" 、"2021-12-09T07:01:56.000Z");
// リクエストで指定された時間後にソースオブジェクトが変更された場合、OSSはオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-modified-since", "2021-12-09T07:01:56.000Z");
// ターゲットオブジェクトのメタデータを設定するために使用されるメソッドを指定します。 この例では、メソッドはCOPYに設定され、ソースオブジェクトのメタデータがコピー先オブジェクトにコピーされることを指定します。
// objectMetadata.setHeader("x-oss-metadata-directive", "COPY");
// オブジェクトの作成時に宛先オブジェクトの暗号化に使用されるサーバー側の暗号化アルゴリズムを指定します。
// objectMetadata.setHeader("x-oss-server-side-encryption" 、"SSE-KMS");
// key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK) を指定します。 このパラメーターは、x-oss-server-side-encryptionをKMSに設定した場合にのみ有効になります。
// objectMetadata.setHeader("x-oss-server-side-encryption-key-id", "9468da86-3509-4f8d-a61e-6eab1eac ****");
// オブジェクトのタグを指定します。 一度に複数のタグを指定できます。
// objectMetadata.setHeader("x-oss-tagging", "a:1");
// ターゲットオブジェクトのタグを設定するために使用されるメソッドを指定します。 この例では、メソッドはCOPYに設定され、ソースオブジェクトのタグが宛先オブジェクトにコピーされることを指定します。
// objectMetadata.setHeader("x-oss-tagging-directive", "COPY");
// 非同期モードでオブジェクトをコピーします。
OSSAsyncTask copyTask = oss.asyncCopyObject(copyObjectRequest, new OSSCompletedCallback<CopyObjectRequest, CopyObjectResult>() {
@オーバーライド
public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {
Log.d("copyObject" 、"copy success!");
}
@オーバーライド
public void onFailure(CopyObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// リクエスト例外を処理します。
if (clientExcepion != null) {
// ネットワーク例外など、クライアント側の例外を処理します。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// サーバー側の例外を処理します。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
参考資料
オブジェクトのコピーに使用される完全なサンプルコードについては、『GitHub』をご参照ください。
オブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「CopyObject」をご参照ください。
OSSClientインスタンスを初期化する方法の詳細については、「初期化」をご参照ください。