iOS簡(jiǎn)單上傳
本文介紹如何從內(nèi)存中上傳文件或者上傳本地文件。您也可以使用MD5校驗(yàn)來(lái)確保上傳過(guò)程中的數(shù)據(jù)完整性。
注意事項(xiàng)
使用本文示例前您需要先通過(guò)自定義域名、STS等方式新建OSSClient,具體請(qǐng)參見(jiàn)初始化。
說(shuō)明所創(chuàng)建存儲(chǔ)空間的所屬地域取決于初始化配置的endpoint地域信息。
要上傳文件,您必須有
oss:PutObject
權(quán)限。具體操作,請(qǐng)參見(jiàn)為RAM用戶(hù)授權(quán)自定義的權(quán)限策略。
從內(nèi)存中上傳文件或上傳本地文件
上傳文件時(shí)可以直接上傳OSSData或者通過(guò)NSURL上傳文件。
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
put.bucketName = @"examplebucket";
// 填寫(xiě)文件完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱(chēng)。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// put.uploadingData = <NSData *>; // 直接上傳NSData。
// (可選)設(shè)置上傳進(jìn)度。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
// 指定當(dāng)前上傳長(zhǎng)度、當(dāng)前已經(jīng)上傳總長(zhǎng)度、待上傳的總長(zhǎng)度。
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
// 配置可選字段。
// put.contentType = @"application/octet-stream";
// 設(shè)置Content-MD5。
// put.contentMd5 = @"eB5eJF1ptWaXm4bijSPyxw==";
// 設(shè)置Object的編碼方式。
// put.contentEncoding = @"identity";
// 設(shè)置Object的展示形式。
// put.contentDisposition = @"attachment";
// 可以在上傳文件時(shí)設(shè)置文件元數(shù)據(jù)或者HTTP頭部。
// NSMutableDictionary *meta = [NSMutableDictionary dictionary];
// 設(shè)置文件元數(shù)據(jù)。
// [meta setObject:@"value" forKey:@"x-oss-meta-name1"];
// 設(shè)置Object的訪(fǎng)問(wèn)權(quán)限為私有。
// [meta setObject:@"private" forKey:@"x-oss-object-acl"];
// 設(shè)置Object的歸檔類(lèi)型為標(biāo)準(zhǔn)存儲(chǔ)。
// [meta setObject:@"Standard" forKey:@"x-oss-storage-class"];
// 設(shè)置覆蓋同名目標(biāo)Object。
// [meta setObject:@"true" forKey:@"x-oss-forbid-overwrite"];
// 指定Object的對(duì)象標(biāo)簽,可同時(shí)設(shè)置多個(gè)標(biāo)簽。
// [meta setObject:@"a:1" forKey:@"x-oss-tagging"];
// 指定OSS創(chuàng)建目標(biāo)Object時(shí)使用的服務(wù)器端加密算法。
// [meta setObject:@"AES256" forKey:@"x-oss-server-side-encryption"];
// 表示KMS托管的用戶(hù)主密鑰,該參數(shù)僅在x-oss-server-side-encryption為KMS時(shí)有效。
// [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會(huì)阻塞當(dāng)前線(xiàn)程,但是不會(huì)阻塞上傳任務(wù)進(jìn)程。
// [putTask waitUntilFinished];
// [put cancel];
上傳到文件目錄
OSS沒(méi)有文件夾的概念,所有元素都是以文件來(lái)存儲(chǔ)。OSS提供了創(chuàng)建模擬文件夾的方式。創(chuàng)建模擬文件夾本質(zhì)上是創(chuàng)建了一個(gè)名稱(chēng)以正斜線(xiàn)(/)結(jié)尾的文件以實(shí)現(xiàn)將文件上傳至目錄,控制臺(tái)會(huì)對(duì)以正斜線(xiàn)(/)結(jié)尾的文件以文件夾的方式展示。
例如上傳文件時(shí),如果把objectKey設(shè)置為folder/subfolder/file
,表示將file文件上傳到folder/subfolder/
目錄下。
路徑默認(rèn)是根目錄,不需要以正斜線(xiàn) (/)開(kāi)頭。
上傳文件時(shí)設(shè)置contentType并帶有MD5校驗(yàn)
為保證客戶(hù)端發(fā)送的數(shù)據(jù)和OSS服務(wù)端接收到的數(shù)據(jù)一致,您可以在上傳文件時(shí)增加contentMd5值,OSS服務(wù)端會(huì)使用該MD5值做校驗(yàn)。上傳文件時(shí)還可以顯式指定contentType,如果未顯式指定contentType,則SDK會(huì)根據(jù)文件名或者上傳的objectKey自行判斷。
使用MD5校驗(yàn)時(shí),性能會(huì)有所下降。
SDK提供了便捷的Base64和contentMd5的計(jì)算方法。
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
put.bucketName = @"examplebucket";
// 填寫(xiě)文件完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱(chēng)。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// 直接上傳NSData。
// put.uploadingData = <NSData *>;
// (可選)設(shè)置contentType。
put.contentType = @"application/octet-stream";
// (可選)設(shè)置contentMd5校驗(yàn)。
// 設(shè)置文件路徑的contentMd5校驗(yàn)。
put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"];
// 設(shè)置二進(jìn)制數(shù)據(jù)的contentMd5校驗(yàn)。
// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>];
// (可選)設(shè)置上傳進(jìn)度。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
// 指定當(dāng)前上傳長(zhǎng)度、當(dāng)前已經(jīng)上傳總長(zhǎng)度、待上傳的總長(zhǎng)度。
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會(huì)阻塞當(dāng)前線(xiàn)程,但是不會(huì)阻塞上傳任務(wù)進(jìn)程。
// [putTask waitUntilFinished];
// [put cancel];
相關(guān)文檔
關(guān)于簡(jiǎn)單上傳的完整示例代碼,請(qǐng)參見(jiàn)GitHub示例。
關(guān)于簡(jiǎn)單上傳的API接口說(shuō)明,請(qǐng)參見(jiàn)PutObject。
關(guān)于初始化OSSClient,請(qǐng)參見(jiàn)如何初始化OSSClient實(shí)例。