需求:最近項目其中一需求為將身份證照片與拍攝人像壓縮后轉base64再UrlEncode上傳服務器進行比對,兩者方法網(wǎng)上比比皆是,但還是遇到了久違的坑浊猾。
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;
}
這兩部分代碼網(wǎng)上分享很多槐沼,也很成熟,但就是這樣默認使用的代碼出現(xiàn)問題憨降。
問題:
UrlEncode字符串上傳華為服務器后無法進行識別通過認證父虑,期間通過修改更換各種壓縮方法,設置圖片壓縮比率都無法通過授药。但是轉換過的base64和UrlEncode編碼都可以在網(wǎng)頁進行圖片還原
問題解決:
問題出現(xiàn)在這個官方Base64編碼上:
NSDataBase64EncodingOptions 這個枚舉中包含如下:
百度到的方法默認大多數(shù)都是使用:
[imgData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
或者
[imgData base64EncodedStringWithOptions:0];
解決:
服務器之所以不能比對成功是其不能讀到這種默認發(fā)送的Base64編碼士嚎,當然大部分使用默認的服務器識別不會出現(xiàn)問題。最終在 Stack Overflow(需拆墻)找到了解決辦法是使用如下兩個可以識別:
如再遇到默認NSDataBase64Encoding64CharacterLineLength不能識別問題悔叽,可以挨個嘗試一下
UrlEncode轉換:http://tool.chinaz.com/tools/urlencode.aspx
Base64圖片轉換:http://imgbase64.duoshitong.com/