ios利用 AFN 上传相册或者拍照图片
由于项目中多处需要上传图片,我们可以自定义上传图片请求,自定义调取相册及拍照,方便多处使用时调用。
主要步骤:
1.第一步:请求上传你选取的相册图片或者拍照图片(经过压缩处理)
2.第二步:获取到第一步图片url上传给服务器
3.第三步:回显图片(当然进入该界面时先判断是否有图片,无图则展示占位图片,否则就回显图片)
废话不多说,直接上代码:
1)封装的上传图片的网络请求(图片压缩)QTXUploadImage文件
//利用afn上传一张图片 #import@interfaceQTXUploadImage:NSObject //上传图片的网络请求(图片压缩) +(void)post:(NSString*)urlimage:(UIImage*)imagename:(NSString*)namesuccess:(void(^)(idjson))successfailure:(void(^)(NSError*error))failure; @end
#import"QTXUploadImage.h" #import"AFNetworking.h" #import"QTXAccount.h" #import"QTXAccountTool.h" @implementationQTXUploadImage /** *上传图片的网络请求(图片压缩) * *@paramurl上传图片的网络请求地址 *@paramname和后台包名一致 * */ +(void)post:(NSString*)urlimage:(UIImage*)imagename:(NSString*)namesuccess:(void(^)(idjson))successfailure:(void(^)(NSError*error))failure{ //1.创建网络管理者 AFHTTPSessionManager*manager=[AFHTTPSessionManagermanager]; //2.拼接请求参数url也可在具体控制器请求里传入 NSDictionary*dict=@{@"userId":[QTXAccountToolaccount].userId}; //3.发送请求 [managerPOST:urlparameters:dictconstructingBodyWithBlock: ^void(idformData){ NSData*imageData=UIImageJPEGRepresentation(image,0.5);//进行图片压缩 //使用日期生成图片名称 NSDateFormatter*formatter=[[NSDateFormatteralloc]init]; formatter.dateFormat=@"yyyyMMddHHmmss"; NSString*fileName=[NSStringstringWithFormat:@"%@.png",[formatterstringFromDate:[NSDatedate]]]; //任意的二进制数据MIMETypeapplication/octet-stream [formDataappendPartWithFileData:imageDataname:namefileName:fileNamemimeType:@"image/png"]; }success:^void(NSURLSessionDataTask*task,idresponseObject){ if(success){ success(responseObject); } }failure:^void(NSURLSessionDataTask*task,NSError*error){ if(failure){ failure(error); } }]; } @end
2)封装的拍照/从相册选择QTXImagePicker文件
//拍照/从相册选择 #importtypedefvoid(^QTXImagePickerFinishAction)(UIImage*image); @interfaceQTXImagePicker:NSObject /** @paramviewController用于presentUIImagePickerController对象 @paramallowsEditing是否允许用户编辑图像 */ +(void)showImagePickerFromViewController:(UIViewController*)viewController allowsEditing:(BOOL)allowsEditing finishAction:(QTXImagePickerFinishAction)finishAction; @end
#import"QTXImagePicker.h" @interfaceQTXImagePicker()@property(nonatomic,weak)UIViewController*viewController; @property(nonatomic,copy)QTXImagePickerFinishActionfinishAction; @property(nonatomic,assign)BOOLallowsEditing; @end staticQTXImagePicker*qtxImagePickerInstance=nil; @implementationQTXImagePicker +(void)showImagePickerFromViewController:(UIViewController*)viewControllerallowsEditing:(BOOL)allowsEditingfinishAction:(QTXImagePickerFinishAction)finishAction{ if(qtxImagePickerInstance==nil){ qtxImagePickerInstance=[[QTXImagePickeralloc]init]; } [qtxImagePickerInstanceshowImagePickerFromViewController:viewController allowsEditing:allowsEditing finishAction:finishAction]; } -(void)showImagePickerFromViewController:(UIViewController*)viewController allowsEditing:(BOOL)allowsEditing finishAction:(QTXImagePickerFinishAction)finishAction{ _viewController=viewController; _finishAction=finishAction; _allowsEditing=allowsEditing; UIActionSheet*sheet=nil; if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ sheet=[[UIActionSheetalloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"从相册选择",nil]; }else{ sheet=[[UIActionSheetalloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"从相册选择",nil]; } UIView*window=[UIApplicationsharedApplication].keyWindow; [sheetshowInView:window]; } -(void)actionSheet:(UIActionSheet*)actionSheetclickedButtonAtIndex:(NSInteger)buttonIndex{ NSString*title=[actionSheetbuttonTitleAtIndex:buttonIndex]; if([titleisEqualToString:@"拍照"]){ UIImagePickerController*picker=[[UIImagePickerControlleralloc]init]; picker.delegate=self; picker.sourceType=UIImagePickerControllerSourceTypeCamera; picker.allowsEditing=_allowsEditing; [_viewControllerpresentViewController:pickeranimated:YEScompletion:nil]; }elseif([titleisEqualToString:@"从相册选择"]){ UIImagePickerController*picker=[[UIImagePickerControlleralloc]init]; //[picker.navigationBarsetBarTintColor:QTXNavColor];//修改相册的导航条的背景颜色 picker.delegate=self; picker.allowsEditing=YES; picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; [_viewControllerpresentViewController:pickeranimated:YEScompletion:nil]; }else{ qtxImagePickerInstance=nil; } } -(void)imagePickerController:(UIImagePickerController*)pickerdidFinishPickingMediaWithInfo:(NSDictionary*)info{ UIImage*image=info[UIImagePickerControllerEditedImage]; if(image==nil){ image=info[UIImagePickerControllerOriginalImage]; } if(_finishAction){ _finishAction(image); } [pickerdismissViewControllerAnimated:YEScompletion:^{}]; qtxImagePickerInstance=nil; } -(void)imagePickerControllerDidCancel:(UIImagePickerController*)picker{ if(_finishAction){ _finishAction(nil); } [pickerdismissViewControllerAnimated:YEScompletion:^{}]; qtxImagePickerInstance=nil; } @end
当使用时,在所需使用的控制器里调用:
[QTXImagePickershowImagePickerFromViewController:selfallowsEditing:YESfinishAction:^(UIImage*image){ if(image){ self.idSideImage=image; [QTXUploadImagepost:QTX_xsz1Urlimage:imagename:@"xsz1"success:^(idjson){ //第一步请求上传 QTXLog(@"图像上传请求成功%@",json); self.idSide=json[@"data"]; }failure:^(NSError*error){ QTXLog(@"学生证图像上传请求失败%@",error); }]; } }];
第二步和第三步需要和各位自己后台server联调,就属于普通的get/post请求了,这边就不放代码了哟
插一下,我们产品没让拍照的照片存储到相册
//存储图片名称:001.png~009.png for(inti=1;i<=9;i++){ UIImage*image=[UIImageimageNamed:[NSStringstringWithFormat:@"00%d.png",i]]; UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil); [NSThreadsleepForTimeInterval:1]; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。