在调试接口的时候,遇到一个问题,就是多张图片上传的时候,不管我上传多少张,只会上传成功最后一张,也就是说只有一张图片上传成功了,针对这个问题,通过查找资料,找到了原因,首先,在上传的过程中,我们获取到本地的image,会放到一个数组里面,在请求方法内进行上传,也就是说接口只调用一次,但是图片是在遍历完成后,一次性上传成功,现在的话,php后台的循环逻辑出现问题,走的还是单张上传逻辑,只是在外层添加了一个循环,这就直接导致了问题的存在,当然安卓那边是正常的,针对这种情况,有两种解决方法:

1,在php端,优化多张图片上传逻辑,然后兼容下单张上传的接口,

2,就是在ios端的上传多张图片的接口,进行代码的优化,把请求提内的遍历,放到外层,然后每上传一张图片就调用一次接口,当然这是种笨办法,因为php后台无法及时处理,只能在前台做优化了,

找后台调试后发现,通过上面的方法上传多张图片,实际上只有一张被传到后台,可能的原因是:

上传多张图片时,由于url的参数没有变化,iOS默认是同一个请求,只发送了一次请求给后台,故后台只收到一张图片。

废话不说了,直接上代码:

正常的上传图片的方法:

        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer.timeoutInterval = 20;manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];[manager POST:[NSString stringWithFormat:@"%@%@",HostUrl,getInfoPhoto] parameters:parameterDict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {// formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体// 这里的_photoArr是你存放图片的数组for (int i = 0; i < headImage.count; i++) {UIImage *image = headImage[i];NSData *imageData = UIImageJPEGRepresentation(image, 0.5);// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名// 要解决此问题,// 可以在上传时使用当前的系统事件作为文件名NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 设置时间格式[formatter setDateFormat:@"yyyyMMddHHmmss"];NSString *dateString = [formatter stringFromDate:[NSDate date]];NSString *fileName = [NSString  stringWithFormat:@"%@.jpg", dateString];/**该方法的参数1. appendPartWithFileData:要上传的照片[二进制流]2. name:对应网站上[upload.php中]处理文件的字段(比如upload)3. fileName:要保存在服务器上的文件名4. mimeType:上传的文件的类型*/[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; //
            }} progress:^(NSProgress * _Nonnull uploadProgress) {//上传进度dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"progress is %@",uploadProgress);});} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {success(responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {failure(error);}];

然后处理过后的代码:

 // 上传多张图片for(NSInteger i = 0; i < headImage.count; i++){AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer.timeoutInterval = 20;manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];__block NSInteger blockI = i;[manager POST:[NSString stringWithFormat:@"%@%@",HostUrl,getInfoPhoto] parameters:parameterDict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {//取出单张图片二进制数据id obj = headImage[blockI];UIImage *image = nil;if ([obj isKindOfClass:[UIImage class]]) {image = (UIImage *)obj;}else{image = [UIImage imageWithContentsOfFile:obj];}if (image) {UIImage *image = headImage[i];NSData *imageData = UIImageJPEGRepresentation(image, 0.5);// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名// 要解决此问题,// 可以在上传时使用当前的系统事件作为文件名NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 设置时间格式[formatter setDateFormat:@"yyyyMMddHHmmss"];NSString *dateString = [formatter stringFromDate:[NSDate date]];NSString *fileName = [NSString  stringWithFormat:@"%@.jpg", dateString];/**该方法的参数1. appendPartWithFileData:要上传的照片[二进制流]2. name:对应网站上[upload.php中]处理文件的字段(比如upload)3. fileName:要保存在服务器上的文件名4. mimeType:上传的文件的类型*/[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; //
}} progress:^(NSProgress * _Nonnull uploadProgress) {NSLog(@"progress is %@",uploadProgress);} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {success(responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {failure(error);}];  }

循环调用接口,必然是不合理,不过在这里只谈问题的解决!

补:另外如果使用AFN,我推荐一个非常牛的封装类,里面把处理缓存的机制加上了,链接如下:

简书地址:http://www.jianshu.com/p/c695d20d95cb

GitHub地址:https://github.com/jkpang/PPNetworkHelper

转载于:https://www.cnblogs.com/hero11223/p/6731670.html

iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片相关推荐

  1. ad绘制箭头_上传单张/多张图片并绘制箭头

    ad绘制箭头 Vue图像抽屉组件 (vue-image-drawer-component) upload single/multi images, draw arrows, circle, lines ...

  2. element el-upload 一次上传单张/多张图片(多选)

    文章目录 前言 一.单张图片的上传 二.一次上传多张图片 前言 这是使用element-ui中的el-upload进行上传的,但是吧,预览是自定义的组件,所以多选会有些麻烦,因为file-list的参 ...

  3. (0081)iOS开发之无限后台定位并上传数据到服务器

    关键词:ios 后台持续定位 iOS 后台的理解 // http://blog.csdn.net/u013773524/article/details/52153917 // http://blog. ...

  4. IOS开发入门之五——storyboard的使用(上)

    需要iOS开发视频资料可以加我微信: 1914532832  验证信息请注明:IOS开发 上节介绍了纯代码开发,就是所有页面全部用代码来写,纯代码开发缺点就是比较慢的,而且很不直观,需要在App运行后 ...

  5. [微信小程序]上传单张和多张图片

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 上传单张图片并展示, <button bindtap="upimg" class=' ...

  6. 微信小程序上传单张和多张图片(附源码)

    上传单张图片并展示: <button bindtap="upimg" class='jia_img' >上传</button> <image src= ...

  7. [iOS开发]——系统框架(effectiveOC2.0阅读笔记)

    系统框架 第47条:熟悉系统框架 要点 第48条:多用块枚举,少用for循环 for循环 使用 Objective-C 1.0的 NSEnumerator 来遍历 快速遍历 基于块的遍历方式 要点 第 ...

  8. 从零开始的iOS开发:00 | Swift基础语法(上)

    目录 一.开发环境 二.关于Swift (一)Swift简介 (二)Swift特性 (三)结语 三.Swift基础语法 (一)编程准备 (二)Hello,world! (三)简单值 1.变量与常量 2 ...

  9. iOS开发中集成阿里云视频上传SDK总结

    阿里云iOS视频上传SDK说明文档 安装 说明1:这两个Framework均需导入. 说明2:此处引入头文件 #import <VODUpload/VODUploadClient.h> # ...

最新文章

  1. VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
  2. 腾讯提超强少样本目标检测算法,公开1000类检测训练集FSOD | CVPR 2020
  3. Shell命令-文件及内容处理之more、less
  4. 【笔记】mysql入门语句8条
  5. Windows 使用小技巧
  6. IE haslayout的理解与bug修复
  7. BCB中的RTTI机制
  8. 安卓APP_ Fragment(3)—— Fragment的生命周期
  9. ubuntu18 激活 pycharm
  10. 小米mysql安装教程_小米 SOAR 开源SQL优化工具安装
  11. 安卓使用MediaPlayer自定义音频视频播放器
  12. P1725 琪露诺 题解(单调队列)
  13. 小程序 · 云开发快速入门与实战
  14. 质性数据分析软件NVivo的编码比较查询
  15. VHDL-任意分频器(50%占空比)
  16. matlab 曲线数据输出,Mathlab 如何输出曲线各数据点值?
  17. 【JavaSE】String类总结,StringBuilder、StringBuffer、String的区别讲解
  18. Cesium近景蓝色晴空万里天空盒子替换方法源码及图片资源-实测可用
  19. 人民网报道金雅福集团董事长黄仕坤
  20. 3种方法封锁BT下载

热门文章

  1. 16位调色板和32位调色板_使调色板可访问
  2. 游戏 新手引导 设计_我认为每个新手设计师都应该知道什么
  3. java rwd_面向任务的设计-不仅限于Mobile First和RWD
  4. 用imageMagick的composite合并图片
  5. [摘]全文检索引擎Solr系列—–全文检索基本原理
  6. SVN四部曲之SVN设置详解深入
  7. Swing学习1——总体概述
  8. python 垃圾回收详解
  9. 线上问题随笔记录数据库连接池问题
  10. 五:CentOS7安装出现Warning