本文介紹如何將源Bucket中的檔案(Object)複製到同一地區下相同或不同目標Bucket中。
注意事項
使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見初始化。
拷貝檔案時,您必須擁有源檔案的讀許可權及目標Bucket的讀寫權限。
不支援跨地區拷貝。例如不能將華東1(杭州)地區儲存空間中的檔案拷貝到華北1(青島)地區。
拷貝的檔案大小不能超過1 GB。
範例程式碼
以下代碼用於拷貝檔案:
OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
// 填寫源Bucket名稱。
copy.sourceBucketName = @"sourcebucket";
// 填寫源Bucket內的Object完整路徑。
copy.sourceObjectKey = @"dir1/srcobject.txt";
// 填寫目標Bucket名稱。
copy.bucketName = @"destbucket";
// 填寫目標Bucket內的Object完整路徑。
copy.objectKey = @"dir2/destobject.txt";
NSMutableDictionary *objectMeta = [NSMutableDictionary dictionary];
// 設定存取權限。此處設定為private,表示私人許可權。
[objectMeta setValue:@"x-oss-object-acl" forKey:@"public-read"];
// 設定儲存類型。此處設定為Standard,表示標準儲存類型。
[objectMeta setValue:@"x-oss-storage-class" forKey:@"Standard"];
// 是否覆蓋同名Object。不指定x-oss-forbid-overwrite時,預設覆蓋同名Object。
// 指定x-oss-forbid-overwrite為false時,表示允許覆蓋同名Object。指定x-oss-forbid-overwrite為true時,表示禁止覆蓋同名Object,如果同名Object已存在,程式將報錯。
[objectMeta setValue:@"x-oss-forbid-overwrite" forKey:@"true"];
// 如果源Object的ETag值和您提供的ETag相等,則執行拷貝操作。
[objectMeta setValue:@"x-oss-copy-source-if-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];
// 如果源Object的ETag值和您提供的ETag不相等,則執行拷貝操作。
[objectMeta setValue:@"x-oss-copy-source-if-none-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];
// 如果檔案實際修改時間早於或等於2021-12-09T07:01:56.000Z,則執行拷貝操作。
[objectMeta setValue:@"x-oss-copy-source-if-unmodified-since" forKey:@"2021-12-09T07:01:56.000Z"];
// 如果檔案實際修改時間晚於2021-12-15T07:01:56.000Z,則執行拷貝操作。
[objectMeta setValue:@"x-oss-copy-source-if-modified-since" forKey:@"2021-12-15T07:01:56.000Z"];
// 複製源Object的中繼資料到目標Object。
[objectMeta setValue:@"x-oss-metadata-directive" forKey:@"COPY"];
// 複製源Object的對象標籤到目標Object。
[objectMeta setValue:@"x-oss-tagging-directive" forKey:@"Copy"];
// 指定OSS建立目標Object時使用的伺服器端密碼編譯演算法。
[objectMeta setValue:@"x-oss-server-side-encryption" forKey:@"KMS"];
// 表示KMS託管的使用者主要金鑰,該參數僅在x-oss-server-side-encryption為KMS時有效。
[objectMeta setValue:@"x-oss-server-side-encryption-key-id" forKey:@"9468da86-3509-4f8d-a61e-6eab1eac****"];
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];
相關文檔
關於拷貝檔案的API介面說明,請參見CopyObject。