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

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

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

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

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

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

正常的上传图片的方法:

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

然后处理过后的代码:

  1. // 上传多张图片
  2. for(NSInteger i = ; i < headImage.count; i++)
  3. {
  4. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  5. manager.requestSerializer.timeoutInterval = ;
  6. manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];
  7.  
  8. __block NSInteger blockI = i;
  9. [manager POST:[NSString stringWithFormat:@"%@%@",HostUrl,getInfoPhoto] parameters:parameterDict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  10. //取出单张图片二进制数据
  11. id obj = headImage[blockI];
  12. UIImage *image = nil;
  13. if ([obj isKindOfClass:[UIImage class]]) {
  14. image = (UIImage *)obj;
  15. }else{
  16. image = [UIImage imageWithContentsOfFile:obj];
  17. }
  18. if (image) {
  19.  
  20. UIImage *image = headImage[i];
  21. NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
  22.  
  23. // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
  24. // 要解决此问题,
  25. // 可以在上传时使用当前的系统事件作为文件名
  26. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  27. // 设置时间格式
  28. [formatter setDateFormat:@"yyyyMMddHHmmss"];
  29. NSString *dateString = [formatter stringFromDate:[NSDate date]];
  30. NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString];
  31. /*
  32. *该方法的参数
  33. 1. appendPartWithFileData:要上传的照片[二进制流]
  34. 2. name:对应网站上[upload.php中]处理文件的字段(比如upload)
  35. 3. fileName:要保存在服务器上的文件名
  36. 4. mimeType:上传的文件的类型
  37. */
  38. [formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; //
  39.  
  40. }
  41. } progress:^(NSProgress * _Nonnull uploadProgress) {
  42.  
  43. NSLog(@"progress is %@",uploadProgress);
  44.  
  45. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  46.  
  47. success(responseObject);
  48.  
  49. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  50. failure(error);
  51. }];
  52. }

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

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

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

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

iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片的更多相关文章

  1. iOS开发:(线程篇-上)线程和进程

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  2. iOS开发中获取视图在屏幕上显示的位置

    在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...

  3. ios开发--集成银联3.3.0

    项目最近需要集成银联,在网上搜了一下发现都并不是最新版的银联集成教程,自己摸索了一下,总结写了下来. 附上3.3.0的下载网址 https://open.unionpay.com/upload/dow ...

  4. iOS开发之第三方登录微信-- 史上最全最新第三方登录微信方式实现

    项目地址 :    https://github.com/zhonggaorong/weixinLoginDemo 最新版本的微信登录实现步骤实现: 1.在进行微信OAuth2.0授权登录接入之前,在 ...

  5. iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现

    相关资源地址: 本项目demo地址 :  https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载:  最新微博SDK 官网注册地址:点击打开链接 最新 ...

  6. iOS开发系列之性能优化(上)

    本篇主要记录一下我对界面优化上的一些探索.关于时间优化的探索将会在中篇里进行介绍.下篇将主要介绍一些耗电优化.安装包瘦身的探索. ### 1.卡顿原理 要了解卡顿原理,需要对帧缓冲区.垂直同步.CPU ...

  7. iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现

    项目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/master 最新版本的qq登录实现步骤实现: 1. 首先,你需要去向腾讯申请账号. ...

  8. ios开发3.5和4.0寸屏幕自适应中的一点问题

    在开发iso应用中需要考虑到ip4的3.5寸屏幕和ip5的4寸屏幕的高度不一样的问题.常见的问题有滚动条位置,底部被挡住等情况:我遇见是tableview中添加下拉上提刷新功能时刷新指示器显示位置的问 ...

  9. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装

    Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...

随机推荐

  1. NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

    本篇文章由:http://xinpure.com/nsurlsessionnsurlconnection-http-load-failed-kcfstreamerrordomainssl-9802/ ...

  2. Solr之困

    http://www.kafka0102.com/2010/08/319.html重写公司的站内搜索.经过前期一段时间对lucene和solr的熟悉,最后决定使用Solr作为新系统的基础框架.现在已经 ...

  3. 使用VS2012遇到的问题

    问题1:VS2012 编译程序时:无法查找或打开PDB文件 解决方法:调试-选项-符号-Microsoft符号服务器打钩,然后确定,就OK了. 问题2:按F5运行.c程序,dos窗口闪退 解决方法:C ...

  4. JavaScript之Web通讯

    web通信,一个特别大的topic,涉及面也是很广的.因最近学习了 javascript 中一些 web 通信知识,在这里总结下.文中应该会有理解错误或者表述不清晰的地方,还望斧正! 一.前言 1. ...

  5. apache 静态编译和动态编译参考

    apache-2.2.22 编译安装笔记 一.静态编译     在使用./configure 编译的时候,即没有使用--enable-mods-shared=[module]或者--enable-[m ...

  6. Spring Cloud(三):服务提供与调用

    上一篇文章我们介绍了eureka服务注册中心的搭建,这篇文章介绍一下如何使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例. 案例中有三个角色:服务注册中心.服务提 ...

  7. centos系统字符编码问题

    1.cat /etc/locale.conf LANG="en_US.UTF-8" 2./etc/profile.d/lang.sh这个文件要有且可以正常执行(检查/sbin/co ...

  8. tcpdump常用参数说明

    (一).学习tcpdump的5个参数 初次使用tcpdump时,使用tcpdump -h命令可以看到它有数十个参数. 根据我们在运维工作中的经验,掌握tcpdump以下5个参数即可满足大部分的工作需要 ...

  9. 解决将Ubuntu下导出的requirements.txt到Centos服务器上面出现pkg-resource的版本为0.0.0

    最直接有效的方法: 原因:

  10. python学习笔记(9)--Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法

    Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法 这篇文章主要介绍了Python UnicodeEncodeErro ...