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];