前言:
在我們上傳圖片的時候,我們最常用的方式估計就是以流的形式上傳了,有些可能知道Base64為上傳,有些可能不知道,現在我們仔細談談這個,最后我么給大家一份項目中真實用到的代碼。方便理解和學習。
正文:
先說說Base64的好處,個人理解他可以減少HTTP請求,適合小尺寸的圖片。一次性上傳的圖片不是特別的多,所以若大尺寸的圖片或者是大批量的圖片上傳使用base64的話,會導致數據太大,加載過慢!這是自己所掌握知道的Base64位的好處。壞處的話就是Base64不能緩存,不能壓縮.
再說說二進制數據流FormData的形式,這個的話就不會受到圖片量大的問題,上傳的速度其實也是挺快的。看看Base64位的源碼:
#pragma mark -- image轉化成Base64位
-(NSString *)imageChangeBase64: (UIImage *)image{
NSData *imageData = nil;
//NSString *mimeType = nil;
if ([self imageHasAlpha:image]) {
imageData = UIImagePNGRepresentation(image);
//mimeType = @"image/png";
}else{
imageData = UIImageJPEGRepresentation(image, 0.3f);
//mimeType = @"image/jpeg";
}
return [NSString stringWithFormat:@"%@",[imageData base64EncodedStringWithOptions: 0]];
}
-(BOOL)imageHasAlpha:(UIImage *)image{
CGImageAlphaInfo alpha = CGImageGetAlphaInfo(image.CGImage);
return (alpha == kCGImageAlphaFirst ||
alpha == kCGImageAlphaLast ||
alpha == kCGImageAlphaPremultipliedFirst ||
alpha == kCGImageAlphaPremultipliedLast);
}
上面的方法,我們就把UIImage轉化成Base64位的字符串給返回了,一般在使用的時候,你接收到這個字符串之后,把它以參數的形式傳給后台就可以了。
還有一種就是我們的FormData的形式,這個大家我估計可能用的比較的頻繁,問題也就不太多了,這里就直接把代碼貼出來就行了:
NSDictionary *dic = @{@"memberId":[[LoginRecord shareLoginRecord] getMemberId],@"image":@"image.jpg"};
// 這里1.0是沒有壓縮圖片
NSData *imageData = UIImageJPEGRepresentation(_portraitImageView.image, 1.0);
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:[NSString stringWithFormat:@"%@%@",BaseUrl,UpdatePortrait] parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
if (imageData) {
NSString * type;
NSString * mimeType;
type = @"jpg";
mimeType = @"image/jpeg";
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
NSString * fileName = [NSString stringWithFormat:@"%@.%@",timeSp,type];
[formData appendPartWithFileData:imageData name:@"image" fileName:fileName mimeType:mimeType];
}
}success:^(AFHTTPRequestOperation *operation, id responseObject){
ShowMessage(@"上傳成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error){
ShowMessage(@"上傳失敗");
}];
