需求:最近项目其中一需求为将身份证照片与拍摄人像压缩后转base64再UrlEncode上传服务器进行比对,两者方法网上比比皆是,但还是遇到了久违的坑。
Base64:
//UIImage图片转Base64字符串:
UIImage *originImage = [UIImage imageNamed:@"xiaoming.png"];
NSData *imgData = UIImageJPEGRepresentation(originImage, 1.0f);
NSString *encodedImageStr = [imgData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//Base64字符串转UIImage图片:
NSData *decodedImageData = [[NSData alloc]initWithBase64EncodedString:encodedImageStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
UIImage *decodedImage = [UIImage imageWithData:decodedImageData];
UrlEncode & UrlDecode
/**
* URLEncode
*/
- (NSString *)urlEncodeStr:(NSString *)input{
NSString *charactersToEscape = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| ";
NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
NSString *upSign = [input stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
return upSign;
}
/**
* URLDecode
*/
-(NSString *)URLDecodedStringWithEncodedStr:(NSString *)encodedString{
NSString *decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,(__bridge CFStringRef)encodedString,CFSTR(""),CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}
这两部分代码网上分享很多,也很成熟,但就是这样默认使用的代码出现问题。
问题:
UrlEncode字符串上传华为服务器后无法进行识别通过认证,期间通过修改更换各种压缩方法,设置图片压缩比率都无法通过。但是转换过的base64和UrlEncode编码都可以在网页进行图片还原
问题解决:
问题出现在这个官方Base64编码上:
NSDataBase64EncodingOptions 这个枚举中包含如下:
百度到的方法默认大多数都是使用:
[imgData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
或者
[imgData base64EncodedStringWithOptions:0];
解决:
服务器之所以不能比对成功是其不能读到这种默认发送的Base64编码,当然大部分使用默认的服务器识别不会出现问题。最终在 Stack Overflow(需拆墙)找到了解决办法是使用如下两个可以识别:
如再遇到默认NSDataBase64Encoding64CharacterLineLength不能识别问题,可以挨个尝试一下
UrlEncode转换:http://tool.chinaz.com/tools/urlencode.aspx
Base64图片转换:http://imgbase64.duoshitong.com/