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

 更新时间:2017年06月22日 15:24:15   作者:smile丽语  
这篇文章主要介绍了ios利用 AFN 上传相册或者拍照图片的相关资料,非常具有实用价值,需要的朋友可以参考下

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

主要步骤:

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];
  }

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

相关文章

  • 详解IOS图层转场动画

    详解IOS图层转场动画

    这篇文章主要为大家详细介绍了IOS图层转场动画, CATransition类实现层的转场动画,能够为层提供移出屏幕和移入屏幕的动画效果,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • iOS中多网络请求的线程安全详解

    iOS中多网络请求的线程安全详解

    这篇文章主要给大家介绍了关于iOS中多网络请求的线程安全的相关资料文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • iOS9中的WebKit 与 Safari带来的惊喜

    iOS9中的WebKit 与 Safari带来的惊喜

    这篇文章主要介绍了iOS9中的WebKit 与 Safari带来的惊喜的相关资料,需要的朋友可以参考下
    2015-11-11
  • iOS中json解析出现的null,nil,NSNumber的解决办法

    iOS中json解析出现的null,nil,NSNumber的解决办法

    在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式,通过本文给大家介绍iOS中json解析出现的null,nil,NSNumber的解决办法,感兴趣的朋友参考下
    2016-01-01
  • IOS 中UIKit-UIPageControl利用delegate定位圆点位置

    IOS 中UIKit-UIPageControl利用delegate定位圆点位置

    这篇文章主要介绍了IOS 中UIKit-UIPageControl利用delegate定位圆点位置 的相关资料,需要的朋友可以参考下
    2017-04-04
  • 详解iOS多线程之2.NSThread的加锁@synchronized

    详解iOS多线程之2.NSThread的加锁@synchronized

    这篇文章主要介绍了详解iOS多线程之2.NSThread的加锁@synchronized,有需要的小伙伴可以参考下。
    2016-11-11
  • iOS动画教你编写Slack的Loading动画进阶篇

    iOS动画教你编写Slack的Loading动画进阶篇

    这篇文章主要为大家进一步详细介绍了iOS动画教你编写Slack的Loading动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • iOS验证手机号的正则表达式

    iOS验证手机号的正则表达式

    这篇文章主要为大家详细介绍了iOS验证手机号的正则表达式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • iOS如何自定义控制器转场动画push详解

    iOS如何自定义控制器转场动画push详解

    在平时开发中,有时候需要一些转场动画给界面调整增添一些活力,而实现这些动画相对比较繁琐。下面这篇文章主要给大家介绍了关于iOS如何自定义控制器转场动画push的相关资料,需要的朋友可以参考下。
    2017-12-12
  • iOS实现侧拉栏抽屉效果

    iOS实现侧拉栏抽屉效果

    这篇文章主要为大家详细介绍了iOS实现侧拉栏抽屉效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02

最新评论