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

发布时间 - 2026-01-11 02:00:39    点击率:

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

主要步骤:

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  # AFN  # 上传相册  # 相册选择图片上传  # 相册图片上传  # iOS框架AVFoundation实现相机拍照、录制视频  # iOS仿微信相机拍照、视频录制功能  # IOS UIImagePickerController从拍照、图库、相册获取图片  # JS解决IOS中拍照图片预览旋转90度BUG的问题  # Android 实现IOS选择拍照相册底部弹出的实例  # iOS拍照后图片自动旋转90度的完美解决方法  # 详解利用exif.js解决ios手机上传竖拍照片旋转90度问题  # iOS视频录制(或选择)压缩及上传功能(整理)  # iOS自定义相机实现拍照、录制视频  # 上传图片  # 上传  # 自定义  # 第二步  # 多处  # 第三步  # 所需  # 我们可以  # 可在  # 学生证  # 不放  # 多说  # 无图  # 到第  # 大家多多  # 就回  # 判断是否  # 导航条  # 二进制数  # 器里 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  手机网站制作与建设方案,手机网站如何建设?  西安专业网站制作公司有哪些,陕西省建行官方网站?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Bootstrap整体框架之CSS12栅格系统  网站优化排名时,需要考虑哪些问题呢?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  微信公众帐号开发教程之图文消息全攻略  HTML 中动态设置元素 name 属性的正确语法详解  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  网站制作壁纸教程视频,电脑壁纸网站?  Swift中swift中的switch 语句  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  phpredis提高消息队列的实时性方法(推荐)  如何在Windows环境下新建FTP站点并设置权限?  如何快速使用云服务器搭建个人网站?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何用IIS7快速搭建并优化网站站点?  Swift中循环语句中的转移语句 break 和 continue  Laravel如何处理CORS跨域请求?(配置示例)  在centOS 7安装mysql 5.7的详细教程  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何在阿里云部署织梦网站?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何正确下载安装西数主机建站助手?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何在宝塔面板中创建新站点?  JavaScript Ajax实现异步通信  如何在Tomcat中配置并部署网站项目?  jQuery 常见小例汇总  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  php json中文编码为null的解决办法  b2c电商网站制作流程,b2c水平综合的电商平台?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  如何在建站之星绑定自定义域名?  如何在宝塔面板创建新站点?