在咱們上傳圖片的時候,咱們最經常使用的方式估計就是以流的形式上傳了,有些可能知道Base64爲上傳,有些可能不知道,如今咱們仔細談談這個,最後我麼給你們一份項目中真實用到的代碼。方便理解和學習。緩存
先說說Base64的好處,我的理解他能夠減小HTTP請求,適合小尺寸的圖片。一次性上傳的圖片不是特別的多,因此若大尺寸的圖片或者是大批量的圖片上傳使用base64的話,會致使數據太大,加載過慢!這是本身所掌握知道的Base64位的好處。壞處的話就是Base64不能緩存,不能壓縮.app
再說說二進制數據流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位的字符串給返回了,通常在使用的時候,你接收到這個字符串以後,把它以參數的形式傳給後臺就能夠了。spa
還有一種就是咱們的FormData的形式,這個你們我估計可能用的比較的頻繁,問題也就不太多了,這裏就直接把代碼貼出來就好了:code
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(@"上傳失敗"); }];