このトピックでは、同一リージョン内のバケット内、またはバケット間でオブジェクトをコピーする方法について説明します。
注意事項
ファイルをコピーするには、ソースファイルに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
リージョン間のコピーはサポートされていません。 たとえば、中国 (杭州) リージョンのバケットから中国 (青島) リージョンのバケットにファイルをコピーすることはできません。
コピーするファイルのサイズは 1 GB を超えることはできません。
このトピックのサンプルコードを実行する前に、カスタムドメイン名やセキュリティトークンサービス (STS) などのメソッドを使用して OSSClient インスタンスを作成する必要があります。 詳細については、「初期化 (Android SDK)」をご参照ください。
権限
デフォルトでは、Alibaba Cloud アカウントはすべての権限を持っています。 Alibaba Cloud アカウントに属する RAM ユーザーまたは RAM ロールは、デフォルトではいかなる権限も持っていません。 Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 定義 |
CopyObject |
| 同一リージョン内のバケット内、またはバケット間でオブジェクトをコピーします。 |
| ||
| versionId を通じてソースオブジェクトのバージョンを指定する場合、この権限も必要です。 | |
| x-oss-tagging を通じてオブジェクトタグをコピーする場合、これらの権限が必要です。 | |
| ||
| versionId を通じてソースオブジェクトの特定バージョンのタグを指定する場合、この権限も必要です。 | |
| オブジェクトをコピーする際に、宛先オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。 | |
|
サンプルコード
次のコードは、ファイルをコピーする方法を示しています。
// ソースバケットの名前を指定します。
String srcBucketName = "src-bucket";
// ソースバケット内のオブジェクトの完全なパスを指定します。
String srcObjectKey = "dir1/source-object.txt";
// 宛先バケットの名前を指定します。ソースバケットと同じリージョンにある必要があります。
String destBucketName = "dest-bucket";
// 宛先バケット内のオブジェクトの完全なパスを指定します。
String destObjectKey = "dir2/destination-object.txt";
// コピーリクエストを作成します。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);
// ObjectMetadata objectMetadata = new ObjectMetadata();
// オブジェクトのアクセス制御リスト (ACL) を設定します。 この例では、ACL は private に設定されています。
// objectMetadata.setHeader("x-oss-object-acl", "private");
// オブジェクトのストレージクラスを設定します。 この例では、ストレージクラスは Standard に設定されています。
// objectMetadata.setHeader("x-oss-storage-class", "Standard");
// 宛先バケットに同じ名前の既存オブジェクトを上書きするかどうかを指定します。 この例では、値は true に設定されており、既存のオブジェクトを上書きできないことを示します。
// objectMetadata.setHeader("x-oss-forbid-overwrite", "true");
// ソースオブジェクトの ETag が指定された ETag と一致する場合にのみ、コピー操作が実行されます。
// objectMetadata.setHeader("x-oss-copy-source-if-match", "5B3C1A2E053D763E1B002CC607C5****");
// コピー操作のソースアドレスを指定します。
// objectMetadata.setHeader("x-oss-copy-source", "/example-bucket/recode-test.txt");
// ソースオブジェクトの ETag が指定された ETag と一致しない場合にのみ、コピー操作が実行されます。
// objectMetadata.setHeader("x-oss-copy-source-if-none-match", "5B3C1A2E053D763E1B002CC607C5****");
// オブジェクトの実際の変更時刻が指定された時刻以前である場合にのみ、コピー操作が実行されます。
// objectMetadata.setHeader("x-oss-copy-source-if-unmodified-since", "2021-12-09T07:01:56.000Z");
// ソースオブジェクトが指定された時刻以降に変更された場合にのみ、コピー操作が実行されます。
// objectMetadata.setHeader("x-oss-copy-source-if-modified-since", "2021-12-09T07:01:56.000Z");
// 宛先オブジェクトのメタデータをどのように設定するかを指定します。 この例では、値は COPY に設定されており、ソースオブジェクトのメタデータが宛先オブジェクトにコピーされることを示します。
// objectMetadata.setHeader("x-oss-metadata-directive", "COPY");
// OSS が宛先オブジェクトを作成するために使用するサーバー側暗号化アルゴリズムを指定します。
// objectMetadata.setHeader("x-oss-server-side-encryption", "SSE-KMS");
// 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>() {
@Override
public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {
Log.d("copyObject", "copy success!");
}
@Override
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 インスタンスを初期化する方法については、「Android 用 OSSClient インスタンスの初期化」をご参照ください。