iOS SDK提供了資料完整性校正來保證您在上傳、下載過程中資料的安全性。
上傳檔案的資料完整性校正
由於移動端網路環境的複雜性,資料在用戶端和伺服器之間傳輸時有可能會出錯。OSS提供了基於MD5和CRC64的端到端的資料完整性驗證功能。
MD5校正
需要在上傳檔案時提供檔案的Content-MD5值,OSS伺服器會協助使用者進行MD5校正,僅當OSS伺服器接收到檔案的MD5值和上傳提供的MD5一致時才可以上傳成功,以此保證上傳資料的完整性。
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。 // 設定Content-MD5。 put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; 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];
CRC校正
與MD5相比,CRC64可以在檔案上傳的同時計算CRC值。
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。 // 開啟CRC校正。 put.crcFlag = OSSRequestCRCOpen; 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];
下載檔案的資料完整性校正
iOS SDK在下載過程中提供了基於CRC的端到端的資料完整性效驗功能。
在讀取資料流時,如果開啟了CRC校正,會在資料流讀取完成時自動驗證資料完整性。
以下代碼用於開啟CRC校正:
OSSGetObjectRequest * request = [OSSGetObjectRequest new];
request.bucketName = @"examplebucket";
request.objectKey = @"exampledir/exampleobject.txt";
// 設定下載檔案的本地路徑
request.downloadToFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// 開啟CRC校正。
request.crcFlag = OSSRequestCRCOpen;
OSSTask * task = [client getObject:request];
[task continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"download object success!");
} else {
NSLog(@"download object failed, error: %@" ,task.error);
}
return nil;
}];
// [task waitUntilFinished];
開啟CRC校正後,如果設定了onReceiveData block,需自行比較CRC值是否一致。
OSSGetObjectRequest * request = [OSSGetObjectRequest new];
request.bucketName = @"examplebucket";
request.objectKey = @"exampledir/exampleobject.txt";
// 設定下載檔案的本地路徑
request.downloadToFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// 開啟CRC校正
request.crcFlag = OSSRequestCRCOpen;
__block uint64_t localCrc64 = 0;
NSMutableData *receivedData = [NSMutableData data];
request.onRecieveData = ^(NSData *data) {
if (data)
{
NSMutableData *mutableData = [data mutableCopy];
void *bytes = mutableData.mutableBytes;
localCrc64 = [OSSUtil crc64ecma:localCrc64 buffer:bytes length:data.length];
[receivedData appendData:data];
}
};
__block uint64_t remoteCrc64 = 0;
OSSTask * task = [client getObject:request];
[task continueWithBlock:^id(OSSTask *task) {
OSSGetObjectResult *result = task.result;
if (result.remoteCRC64ecma)
{
NSScanner *scanner = [NSScanner scannerWithString:result.remoteCRC64ecma];
[scanner scanUnsignedLongLong:&remoteCrc64];
if (remoteCrc64 == localCrc64)
{
NSLog(@"crc64校正成功!");
}
else
{
NSLog(@"crc64校正失敗!");
}
}
return nil;
}];
// waitUntilFinished會阻塞當前線程,但是不會阻塞上傳任務進程。
// [task waitUntilFinished];