このトピックでは、同一リージョン内のバケット内、またはバケット間でオブジェクトをコピーする方法について説明します。
注意事項
このトピックの例を使用する前に、カスタムドメイン名、セキュリティトークンサービス (STS)、またはその他の方法を使用して OSSClient インスタンスを作成する必要があります。 詳細については、「初期化 (iOS SDK)」をご参照ください。
ファイルをコピーするには、ソースファイルに対する読み取り権限と、宛先バケットに対する読み取り/書き込み権限が必要です。
リージョン間のコピー操作はサポートされていません。 たとえば、中国 (杭州) リージョンのバケットから中国 (青島) リージョンのバケットにファイルをコピーすることはできません。
コピーするファイルのサイズは 1 GB を超えることはできません。
権限
デフォルトでは、Alibaba Cloud アカウントはすべての権限を持っています。Alibaba Cloud アカウント配下の RAM ユーザーまたは RAM ロールは、デフォルトではいかなる権限も持っていません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 説明 |
CopyObject |
| 同一リージョン内のバケット内、またはバケット間でオブジェクトをコピーします。 |
| ||
| versionId を通じてソースオブジェクトのバージョンを指定する場合、この権限も必要です。 | |
| x-oss-tagging を通じてオブジェクトタグをコピーする場合、これらの権限が必要です。 | |
| ||
| versionId を通じてソースオブジェクトの特定バージョンのタグを指定する場合、この権限も必要です。 | |
| オブジェクトをコピーする際、宛先オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。 | |
|
サンプルコード
次のコードは、ファイルをコピーする方法の例を示しています。
OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
// ソースバケットの名前を指定します。
copy.sourceBucketName = @"sourcebucket";
// ソースバケット内のオブジェクトの完全なパスを指定します。
copy.sourceObjectKey = @"dir1/srcobject.txt";
// 宛先バケットの名前を指定します。
copy.bucketName = @"destbucket";
// 宛先バケット内のオブジェクトの完全なパスを指定します。
copy.objectKey = @"dir2/destobject.txt";
NSMutableDictionary *objectMeta = [NSMutableDictionary dictionary];
// アクセス制御リスト (ACL) を設定します。 この例では、値は public-read に設定されています。
[objectMeta setValue:@"public-read" forKey:@"x-oss-object-acl"];
// ストレージクラスを設定します。 この例では、値は Standard に設定されています。
[objectMeta setValue:@"Standard" forKey:@"x-oss-storage-class"];
// 同じ名前のオブジェクトを上書きするかどうかを指定します。 x-oss-forbid-overwrite を指定しない場合、オブジェクトはデフォルトで上書きされます。
// x-oss-forbid-overwrite を false に設定すると、オブジェクトは上書きできます。 x-oss-forbid-overwrite を true に設定すると、オブジェクトは上書きできません。 同じ名前のオブジェクトが存在する場合、エラーが報告されます。
[objectMeta setValue:@"true" forKey:@"x-oss-forbid-overwrite"];
// コピー操作は、ソースオブジェクトの ETag が指定した ETag と一致する場合にのみ実行されます。
[objectMeta setValue:@"5B3C1A2E053D763E1B002CC607C5****" forKey:@"x-oss-copy-source-if-match"];
// コピー操作は、ソースオブジェクトの ETag が指定した ETag と一致しない場合にのみ実行されます。
[objectMeta setValue:@"5B3C1A2E053D763E1B002CC607C5****" forKey:@"x-oss-copy-source-if-none-match"];
// コピー操作は、オブジェクトの最終更新日時が 2021-12-09T07:01:56.000Z 以前である場合にのみ実行されます。
[objectMeta setValue:@"2021-12-09T07:01:56.000Z" forKey:@"x-oss-copy-source-if-unmodified-since"];
// コピー操作は、オブジェクトの最終更新日時が 2021-12-15T07:01:56.000Z より後である場合にのみ実行されます。
[objectMeta setValue:@"2021-12-15T07:01:56.000Z" forKey:@"x-oss-copy-source-if-modified-since"];
// メタデータをソースオブジェクトから宛先オブジェクトにコピーします。
[objectMeta setValue:@"COPY" forKey:@"x-oss-metadata-directive"];
// タグをソースオブジェクトから宛先オブジェクトにコピーします。
[objectMeta setValue:@"Copy" forKey:@"x-oss-tagging-directive"];
// OSS が宛先オブジェクトを作成するために使用するサーバ側暗号化アルゴリズムを指定します。
[objectMeta setValue:@"KMS" forKey:@"x-oss-server-side-encryption"];
// KMS によって管理されるカスタマーマスターキー (CMK)。 このパラメーターは、x-oss-server-side-encryption が KMS に設定されている場合にのみ有効です。
[objectMeta setValue:@"9468da86-3509-4f8d-a61e-6eab1eac****" forKey:@"x-oss-server-side-encryption-key-id"];
copy.objectMeta = objectMeta;
OSSTask * task = [client copyObject:copy];
[task continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"Copy object success!");
} else {
NSLog(@"Copy object failed. Error: %@" , task.error);
}
return nil;
}];
// 現在のスレッドをブロックして、タスクが完了するのを待ちます。
// [task waitUntilFinished];関連ドキュメント
CopyObject API 操作の詳細については、「CopyObject」をご参照ください。