本文介紹如何從記憶體中上傳檔案或者上傳本地檔案。您也可以使用MD5校正來確保上傳過程中的資料完整性。
注意事項
使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見初始化。
所建立儲存空間的所屬地區取決於初始化配置的endpoint地區資訊。
許可權說明
阿里雲帳號預設擁有全部許可權。阿里雲帳號下的RAM使用者或RAM角色預設沒有任何許可權,需要阿里雲帳號或帳號管理員通過RAM Policy或Bucket Policy授予操作許可權。
API | Action | 說明 |
PutObject |
| 上傳Object。 |
| 上傳Object時,如果通過x-oss-tagging指定Object的標籤,則需要此操作的許可權。 | |
| 上傳Object時,如果Object的中繼資料套件含X-Oss-Server-Side-Encryption: KMS,則需要這兩個操作的許可權。 | |
|
從記憶體中上傳檔案或上傳本地檔案
上傳檔案時可以直接上傳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];
相關文檔
關於簡單上傳的完整範例程式碼,請參見GitHub樣本。
關於簡單上傳的API介面說明,請參見PutObject。
關於初始化OSSClient,請參見如何初始化OSSClient執行個體。