欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

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

上一篇:

下一篇: