iOS SDK提供了数据完整性校验来保证您在上传、下载过程中数据的安全性。
上传文件的数据完整性校验
由于移动端网络环境的复杂性,数据在客户端和服务器之间传输时有可能会出错。OSS提供了基于MD5和CRC64的端到端的数据完整性验证功能。
- MD5校验
需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,仅当OSS服务器接收到文件的MD5值和上传提供的MD5一致时才可以上传成功,以此保证上传数据的完整性。
OSSPutObjectRequest * request = [OSSPutObjectRequest new]; request.bucketName = BUCKET_NAME; ... request.contentMd5 = [base64Md5ForFilePath];
- CRC校验
与MD5相比,CRC64可以在文件上传的同时计算CRC值。
// 构造上传请求。 OSSPutObjectRequest * request = [OSSPutObjectRequest new]; request.bucketName = BUCKET_NAME; ///.... request.crcFlag = OSSRequestCRCOpen; // 开启CRC校验。 OSSTask * task = [_client putObject:request]; [[task continueWithBlock:^id(OSSTask *task) { // 如果在传输过程中数据不一致,则CRC64校验失败,并提示OSSClientErrorCodeInvalidCRC错误。 XCTAssertNil(task.error); return nil; }] waitUntilFinished];
下载文件的数据完整性校验
iOS SDK在下载过程中提供了基于CRC的端到端的数据完整性效验功能。
在读取数据流时,如果开启了CRC校验,会在数据流读取完成时自动验证数据完整性。
以下代码用于开启CRC校验:
OSSGetObjectRequest * request = [OSSGetObjectRequest new]; request.bucketName = BUCKET_NAME; // 开启CRC校验。 request.crcFlag = OSSRequestCRCOpen; OSSTask * task = [testProxyClient getObject:request]; [[task continueWithBlock:^id(OSSTask *task) { // 开启CRC校验后,如果在传输过程中出现数据错误,则提示OSSClientErrorCodeInvalidCRC。 XCTAssertNil(task.error); return nil; }] waitUntilFinished]; // 开启CRC校验后,如果设置了onReceiveData block,需自行比较CRC值是否一致。 OSSGetObjectRequest * request = [OSSGetObjectRequest new]; request.bucketName = BUCKET_NAME; 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) { XCTAssertNil(task.error); 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];