全部產品
Search
文件中心

Object Storage Service:iOS簡單上傳

更新時間:Apr 02, 2025

本文介紹如何從記憶體中上傳檔案或者上傳本地檔案。您也可以使用MD5校正來確保上傳過程中的資料完整性。

注意事項

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

說明

所建立儲存空間的所屬地區取決於初始化配置的endpoint地區資訊。

許可權說明

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

API

Action

說明

PutObject

oss:PutObject

上傳Object。

oss:PutObjectTagging

上傳Object時,如果通過x-oss-tagging指定Object的標籤,則需要此操作的許可權。

kms:GenerateDataKey

上傳Object時,如果Object的中繼資料套件含X-Oss-Server-Side-Encryption: KMS,則需要這兩個操作的許可權。

kms:Decrypt

從記憶體中上傳檔案或上傳本地檔案

上傳檔案時可以直接上傳OSSData或者通過NSURL上傳檔案。

OSSPutObjectRequest * put = [OSSPutObjectRequest new];

// 填寫Bucket名稱,例如examplebucket。
put.bucketName = @"examplebucket";
// 填寫檔案完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// put.uploadingData = <NSData *>; // 直接上傳NSData。

// (可選)設定上傳進度。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    // 指定當前上傳長度、當前已經上傳總長度、待上傳的總長度。
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
// 配置可選欄位。
// put.contentType = @"application/octet-stream";
// 設定Content-MD5。
// put.contentMd5 = @"eB5eJF1ptWaXm4bijSPyxw==";
// 設定Object的編碼方式。
// put.contentEncoding = @"identity";
// 設定Object的展示形式。
// put.contentDisposition = @"attachment";
// 可以在上傳檔案時設定檔案中繼資料或者HTTP頭部。
// NSMutableDictionary *meta = [NSMutableDictionary dictionary];
// 設定檔案中繼資料。
// [meta setObject:@"value" forKey:@"x-oss-meta-name1"];
// 設定Object的存取權限為私人。
// [meta setObject:@"private" forKey:@"x-oss-object-acl"];
// 設定Object的歸檔類型為標準儲存。
// [meta setObject:@"Standard" forKey:@"x-oss-storage-class"];
// 設定覆蓋同名目標Object。
// [meta setObject:@"true" forKey:@"x-oss-forbid-overwrite"];
// 指定Object的對象標籤,可同時設定多個標籤。
// [meta setObject:@"a:1" forKey:@"x-oss-tagging"];
// 指定OSS建立目標Object時使用的伺服器端密碼編譯演算法。
// [meta setObject:@"AES256" forKey:@"x-oss-server-side-encryption"];
// 表示KMS託管的使用者主要金鑰,該參數僅在x-oss-server-side-encryption為KMS時有效。
// [meta setObject:@"9468da86-3509-4f8d-a61e-6eab1eac****" forKey:@"x-oss-server-side-encryption-key-id"];
// put.objectMeta = meta;
OSSTask * putTask = [client putObject:put];

[putTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"upload object success!");
    } else {
        NSLog(@"upload object failed, error: %@" , task.error);
    }
    return nil;
}];
// waitUntilFinished會阻塞當前線程,但是不會阻塞上傳任務進程。
// [putTask waitUntilFinished];
// [put cancel];

上傳到檔案目錄

OSS沒有檔案夾的概念,所有元素都是以檔案來儲存。OSS提供了建立類比檔案夾的方式。建立類比檔案夾本質上是建立了一個名稱以正斜線(/)結尾的檔案以實現將檔案上傳至目錄,控制台會對以正斜線(/)結尾的檔案以檔案夾的方式展示。

例如上傳檔案時,如果把objectKey設定為folder/subfolder/file,表示將file檔案上傳到folder/subfolder/目錄下。

說明

路徑預設是根目錄,不需要以正斜線 (/)開頭。

上傳檔案時設定contentType並帶有MD5校正

為保證用戶端發送的資料和OSS服務端接收到的資料一致,您可以在上傳檔案時增加contentMd5值,OSS服務端會使用該MD5值做校正。上傳檔案時還可以顯式指定contentType,如果未顯式指定contentType,則SDK會根據檔案名稱或者上傳的objectKey自行判斷。

重要

使用MD5校正時,效能會有所下降。

SDK提供了便捷的Base64和contentMd5的計算方法。

OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// 填寫Bucket名稱,例如examplebucket。
put.bucketName = @"examplebucket";
// 填寫檔案完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// 直接上傳NSData。
// put.uploadingData = <NSData *>; 
// (可選)設定contentType。
put.contentType = @"application/octet-stream";
// (可選)設定contentMd5校正。
// 設定檔案路徑的contentMd5校正。
put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; 
// 設定位元據的contentMd5校正。
// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>];
// (可選)設定上傳進度。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    // 指定當前上傳長度、當前已經上傳總長度、待上傳的總長度。
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
OSSTask * putTask = [client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"upload object success!");
    } else {
        NSLog(@"upload object failed, error: %@" , task.error);
    }
    return nil;
}];
// waitUntilFinished會阻塞當前線程,但是不會阻塞上傳任務進程。
// [putTask waitUntilFinished];
// [put cancel];

相關文檔