全部產品
Search
文件中心

Object Storage Service:拷貝檔案(iOS SDK)

更新時間:Dec 05, 2025

本文介紹如何將源Bucket中的檔案(Object)複製到同一地區下相同或不同目標Bucket中。

注意事項

  • 使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見初始化(iOS SDK)

  • 拷貝檔案時,您必須擁有源檔案的讀許可權及目標Bucket的讀寫權限。

  • 不支援跨地區拷貝。例如不能將華東1(杭州)地區儲存空間中的檔案拷貝到華北1(青島)地區。

  • 拷貝的檔案大小不能超過1 GB。

許可權說明

阿里雲帳號預設擁有全部許可權。阿里雲帳號下的RAM使用者或RAM角色預設沒有任何許可權,需要阿里雲帳號或帳號管理員通過RAM PolicyBucket Policy授予操作許可權。

API

Action

說明

CopyObject

oss:GetObject

拷貝同一地區下相同或不同儲存空間(Bucket)之間的檔案(Object)。

oss:PutObject

oss:GetObjectVersion

如果通過versionId指定拷貝的源Object版本,還需要此操作的許可權。

oss:GetObjectTagging

如果通過x-oss-tagging拷貝Object的標籤,則需要此操作的許可權。

oss:PutObjectTagging

oss:GetObjectVersionTagging

如果通過versionId指定拷貝的源Object特定版本的Object的標籤,還需要此操作的許可權。

kms:GenerateDataKey

拷貝Object時,如果目標Object的中繼資料套件含X-Oss-Server-Side-Encryption: KMS,則需要這兩個許可權。

kms:Decrypt

範例程式碼

以下代碼用於拷貝檔案:

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