本文介紹如何從記憶體中上傳檔案或者上傳本地檔案。您也可以使用MD5校正來確保上傳過程中的資料完整性。
注意事項
使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見初始化。
說明所建立儲存空間的所屬地區取決於初始化配置的endpoint地區資訊。
要上傳檔案,您必須有
oss:PutObject
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
從記憶體中上傳檔案或上傳本地檔案
上傳檔案時可以直接上傳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執行個體。