ios利用 AFN 上传相册或者拍照图片
程序员文章站
2023-12-19 14:02:34
由于项目中多处需要上传图片,我们可以自定义上传图片请求,自定义调取相册及拍照,方便多处使用时调用。
主要步骤:
1.第一步:请求上传你选取的相册图片或者拍照图片(经...
由于项目中多处需要上传图片,我们可以自定义上传图片请求,自定义调取相册及拍照,方便多处使用时调用。
主要步骤:
1.第一步:请求上传你选取的相册图片或者拍照图片(经过压缩处理)
2.第二步:获取到第一步图片url上传给服务器
3.第三步:回显图片(当然进入该界面时先判断是否有图片,无图则展示占位图片,否则就回显图片)
废话不多说,直接上代码:
1)封装的上传图片的网络请求(图片压缩) qtxuploadimage 文件
// 利用 afn 上传一张图片 #import <foundation/foundation.h> @interface qtxuploadimage : nsobject // 上传图片的网络请求(图片压缩) + (void)post:(nsstring *)url image:(uiimage *)image name:(nsstring *)name success:(void (^)(id json))success failure:(void (^)(nserror *error))failure; @end
#import "qtxuploadimage.h" #import "afnetworking.h" #import "qtxaccount.h" #import "qtxaccounttool.h" @implementation qtxuploadimage /** * 上传图片的网络请求(图片压缩) * * @param url 上传图片的网络请求地址 * @param name 和后台包名一致 * */ + (void)post:(nsstring *)url image:(uiimage *)image name:(nsstring *)name success:(void (^)(id json))success failure:(void (^)(nserror *error))failure { // 1.创建网络管理者 afhttpsessionmanager *manager = [afhttpsessionmanager manager]; // 2.拼接请求参数url 也可在具体控制器请求里传入 nsdictionary *dict = @{@"userid" : [qtxaccounttool account].userid}; // 3.发送请求 [manager post:url parameters:dict constructingbodywithblock: ^void(id<afmultipartformdata> formdata) { nsdata *imagedata = uiimagejpegrepresentation(image, 0.5);//进行图片压缩 // 使用日期生成图片名称 nsdateformatter *formatter = [[nsdateformatter alloc] init]; formatter.dateformat = @"yyyymmddhhmmss"; nsstring *filename = [nsstring stringwithformat:@"%@.png",[formatter stringfromdate:[nsdate date]]]; // 任意的二进制数据mimetype application/octet-stream [formdata appendpartwithfiledata:imagedata name:name filename:filename mimetype:@"image/png"]; } success:^void(nsurlsessiondatatask * task, id responseobject) { if (success) { success(responseobject); } } failure:^void(nsurlsessiondatatask * task, nserror * error) { if (failure) { failure(error); } }]; } @end
2)封装的拍照/从相册选择 qtximagepicker 文件
// 拍照/从相册选择 #import <foundation/foundation.h> typedef void(^qtximagepickerfinishaction)(uiimage *image); @interface qtximagepicker : nsobject /** @param viewcontroller 用于present uiimagepickercontroller对象 @param allowsediting 是否允许用户编辑图像 */ + (void)showimagepickerfromviewcontroller:(uiviewcontroller *)viewcontroller allowsediting:(bool)allowsediting finishaction:(qtximagepickerfinishaction)finishaction; @end
#import "qtximagepicker.h" @interface qtximagepicker()<uiactionsheetdelegate, uiimagepickercontrollerdelegate, uinavigationcontrollerdelegate> @property (nonatomic, weak) uiviewcontroller *viewcontroller; @property (nonatomic, copy) qtximagepickerfinishaction finishaction; @property (nonatomic, assign) bool allowsediting; @end static qtximagepicker *qtximagepickerinstance = nil; @implementation qtximagepicker + (void)showimagepickerfromviewcontroller:(uiviewcontroller *)viewcontroller allowsediting:(bool)allowsediting finishaction:(qtximagepickerfinishaction)finishaction { if (qtximagepickerinstance == nil) { qtximagepickerinstance = [[qtximagepicker alloc] init]; } [qtximagepickerinstance showimagepickerfromviewcontroller: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 ([uiimagepickercontroller issourcetypeavailable:uiimagepickercontrollersourcetypecamera]) { sheet = [[uiactionsheet alloc] initwithtitle:nil delegate:self cancelbuttontitle:@"取消" destructivebuttontitle:nil otherbuttontitles:@"拍照", @"从相册选择", nil]; }else { sheet = [[uiactionsheet alloc] initwithtitle:nil delegate:self cancelbuttontitle:@"取消" destructivebuttontitle:nil otherbuttontitles:@"从相册选择", nil]; } uiview *window = [uiapplication sharedapplication].keywindow; [sheet showinview:window]; } - (void)actionsheet:(uiactionsheet *)actionsheet clickedbuttonatindex:(nsinteger)buttonindex { nsstring *title = [actionsheet buttontitleatindex:buttonindex]; if ([title isequaltostring:@"拍照"]) { uiimagepickercontroller *picker = [[uiimagepickercontroller alloc] init]; picker.delegate = self; picker.sourcetype = uiimagepickercontrollersourcetypecamera; picker.allowsediting = _allowsediting; [_viewcontroller presentviewcontroller:picker animated:yes completion:nil]; }else if ([title isequaltostring:@"从相册选择"]) { uiimagepickercontroller *picker = [[uiimagepickercontroller alloc] init]; // [picker.navigationbar setbartintcolor:qtxnavcolor]; // 修改相册的导航条的背景颜色 picker.delegate = self; picker.allowsediting = yes; picker.sourcetype = uiimagepickercontrollersourcetypephotolibrary; [_viewcontroller presentviewcontroller:picker animated:yes completion:nil]; }else { qtximagepickerinstance = nil; } } - (void)imagepickercontroller:(uiimagepickercontroller *)picker didfinishpickingmediawithinfo:(nsdictionary *)info { uiimage *image = info[uiimagepickercontrollereditedimage]; if (image == nil) { image = info[uiimagepickercontrolleroriginalimage]; } if (_finishaction) { _finishaction(image); } [picker dismissviewcontrolleranimated:yes completion:^{}]; qtximagepickerinstance = nil; } - (void)imagepickercontrollerdidcancel:(uiimagepickercontroller *)picker { if (_finishaction) { _finishaction(nil); } [picker dismissviewcontrolleranimated:yes completion:^{}]; qtximagepickerinstance = nil; } @end
当使用时,在所需使用的控制器里调用:
[qtximagepicker showimagepickerfromviewcontroller:self allowsediting:yes finishaction:^(uiimage *image) { if (image) { self.idsideimage = image; [qtxuploadimage post:qtx_xsz1url image:image name:@"xsz1" success:^(id json) { // 第一步请求上传 qtxlog(@"图像上传请求成功 %@", json); self.idside = json[@"data"]; } failure:^(nserror *error) { qtxlog(@"学生证图像上传请求失败 %@", error); }]; } }];
第二步和第三步 需要和各位自己后台server联调,就属于普通的get/post请求了,这边就不放代码了哟
插一下,我们产品没让拍照的照片存储到相册
// 存储图片名称:001.png ~ 009.png for (int i = 1; i<=9; i++) { uiimage *image = [uiimage imagenamed:[nsstring stringwithformat:@"00%d.png", i]]; uiimagewritetosavedphotosalbum(image, nil, nil, nil); [nsthread sleepfortimeinterval:1]; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。