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];
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。