首页 > 系统 > iOS > 正文

ios利用 AFN 上传相册或者拍照图片

2019-10-21 18:45:52
字体:
来源:转载
供稿:网友

由于项目中多处需要上传图片,我们可以自定义上传图片请求,自定义调取相册及拍照,方便多处使用时调用。

主要步骤:

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 "ios/224333.html">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;@endstatic 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.pngfor (int i = 1; i<=9; i++) {   UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"00%d.png", i]];   UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);   [NSThread sleepForTimeInterval:1];  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到IOS开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表