当前位置: 移动技术网 > IT编程>移动开发>IOS > ios利用 AFN 上传相册或者拍照图片

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

北京路况交通眼,程维高回忆录,聂小倩的梦岛

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

主要步骤:

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 uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网