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

在调试接口的时候,遇到一个问题,就是多张图片上传的时候,不管我上传多少张,只会上传成功最后一张,也就是说只有一张图片上传成功了,针对这个问题,通过查找资料,找到了原因,首先,在上传的过程中,我们获取到本地的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVN之如何解决从一个svn路径下载项目快速提交到其它svn路径

1、问题 每次做定制的时候&#xff0c;需要从svn checkout项目&#xff0c;然后去除.svn ,然后再去放到自己需要上库的文件夹去&#xff0c;然后这样在windows平台操作非常麻烦&#xff08;配置比较差&#xff09;&#xff0c;然后现在在linux平台解决这个慢的问题&#xff08…

wpa_supplicant 无线网络配置

为什么80%的码农都做不了架构师&#xff1f;>>> 安装wpa_supplicant后&#xff0c;修改服务&#xff0c;编辑 /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service 将下面的 [D-BUS Service] Namefi.epitest.hostap.WPASupplicant Exec/s…

计算机专业技能考核方案,计算机专业技能课教学目标考核方案教程.doc

计算机专业技能课教学目标考核方案教程惠州市宝山职校计算机专业学生培养目标量化考核方案考核项目计算机办公应用方向  [A]        动画制作方向   [B]硬件维护方向     [C]图形图像处理方向   [D]             二、考核标准计算机专业(计算机…

Java数据库编程

ava与数据库交互的主要API是jdbc。jdbc的主要目的是&#xff1a;1.通过使用SQL或者专有的SQL扩展&#xff0c;程序员可以利用java语言开发访问数据的应用。2.数据库开发商或者数据库工具开发商改进数据库驱动程序jdbc通用的使用方式如下&#xff1a;Class.forName(jdbcDriverNa…

Avalonia跨平台入门第六篇之Grid动态分割

前面玩耍了ListBox多选,今天在他的基础上对Grid进行动态分割;这个效果其实在Xamarin中已经实现过了;其实都没太大区别;直接看效果吧:在ListBox中选择了具体的布局后进行Grid布局分割:具体分割的方法和原来在移动端没啥区别:下一篇就是控件的拖放了;最终简单的效果先这样吧;以后…

Python打包方法基本应用方式介绍

Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言&#xff0c;对于经验丰富的开发人员来说&#xff0c;掌握这样一款语言在其程序开发中是一个比较重要的选择。我们今天就先来了解一下python打包方法的相关应用。Python查找重复文件相关操作方式分享四种Pyth…

使用ABBYY FineReader进行自动图像预处理

2019独角兽企业重金招聘Python工程师标准>>> 扫描图像和数码照片中常见的扭曲文本行、歪斜、噪声和其他缺陷可能会降低识别质量&#xff0c;ABBYY FineReader可自动消除这些缺陷&#xff0c;也允许手动消除。 ABBYY FineReader有几个图像预处理功能&#xff0c;如果…

Android之在launcher里面动态加载桌面图标

1、在手机桌面加载图标方式 1&#xff09;、动态加载 Launcher.java private void addSourceList() {Intent launchIntent new Intent(this, RcGrpActivity.class);launchIntent.setAction(Intent.ACTION_MAIN);launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Intent …

计算机与交通工程论文,交通工程论文.doc

淮 阴 工 学 院毕业设计(论文)系 部&#xff1a; 交 通 工 程 系专 业&#xff1a; 交 通 工 程学生姓名: 徐东成 学 号:设计(论文)题目&#xff1a; 城市交通信息系统功能研究起 迄 日 期: 2006年 2 月 20日 ~ 06月10日设计(论文) 地点: 大学城指 导 教 师: 夏晶晶专 业 负 责…

Avalonia跨平台入门第五篇之ListBox多选

前面我也提前预告了今天要实现的效果;不过中间被卡了一下;今天赶紧去弥补上次要做的效果,其实在WPF效果中已经实现过了,看效果吧:ListBox的前台布局代码:使用的附加属性和WPF好相似:子项模板(绑定写法简化了好多):多值转换器(少了一个ConvertBack):最终简单的效果先这样吧;以后…

Android之android.os.NewWorkOnMainThreadException解决办法

1、问题 用别人提供的的sdk的Demo出现android.os.NewWorkOnMainThreadException 2、解决办法 网络请求开启一个线程请求或者开启异步任务都行 3、总结 1、 之前就看到过这种android.os.NewWorkOnMainThreadException异常&#xff0c;时间很久了&#xff0c;自己也没反映过来&a…

mediawiki 搭建

[1] http://www.cnblogs.com/mchina/archive/2012/11/28/2778779.html转载于:https://www.cnblogs.com/deepblueme/p/4665610.html

金蝶K/3 WISE 12.3订单跟踪SQL报表

金蝶K3一直缺少完整的跟踪报表&#xff0c;所以我们开发了一张完整的跟踪报表&#xff0c;通过查询分析工具直接生成。代码&#xff08;WIN2008 R2SQL 2008 R2环境&#xff0c;K3 WISE 12.3&#xff09;&#xff1a;select t1.fname1 客户,t1.fname2 业务员,t1.f_102 款号,t1.f…

计算机与人脑的异同作文,小学信息技术3-6年级全册教案.pdf

清华版小学信息技术 3-6 年级全册教案三年级上册教学计划课 题 1、芝麻开门1、了解计算机的组成和用途&#xff0c;认识计算机的桌面。教学目标2 、鼠标的基本操作。教 学初步学会使用鼠标的移动、指向、单击。重难点PowerPoint教具软件、多媒体电脑一、引入&#xff1a;教 同学…

Fragment 键盘弹出方式设置

由于在FragmentActivity中配置SoftInputMode不好使&#xff0c;所以要在Fragment 中设定&#xff1a;getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);转载于:https://www.cnblogs.com/chenlong-50954265/p/3924094.html

开源绘画应用 Pinta 已移植到GTK 3和.NET 6

Pinta [1]是一款开源绘画应用&#xff0c;适用于 Linux、Windows 和 macOS。你可以用它来进行自由手绘/素描。你也可以用它在现有的图片上添加箭头、方框、文字等。年初发布了 Pinta 2.0.2 版本&#xff0c;这是我看到的第一款桌面的dotnet6 和 gtksharp的 应用。Pinta是一个小…

Druid源码分析系列1:dataSource.init()的准备工作

2019独角兽企业重金招聘Python工程师标准>>> 本节&#xff0c;讲解 dataSource.init(); 打断点在 stop in com.alibaba.druid.pool.DruidDataSource.init 好&#xff0c;开始研究代码 public void init() throws SQLException {// 首先确定没有initedif (inited) {r…

软件测试推荐专业,软件测试专业老师推荐信

尊敬的领导&#xff1a;您好&#xff01;首先感谢您在百忙之中抽出时间来阅读我学生XX的推荐信&#xff01;该生是XX大学软件测试专业应届毕业生&#xff0c;自进入XX大学以来&#xff0c;凭借自身扎实的基础和顽强拼搏的奋斗精神&#xff0c;经过几年不断的学习&#xff0c;在…

Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信

1、上代码 activity_main.xml文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_p…

poj 2398 Toy Storage (计算几何,判断点和线段关系)

http://poj.org/problem?id2398 题意大概是说将一个盒子用n个board分成n1 部分 然后往里面放toy,给定盒子,board,和toy的坐标 问所有的toy放完后,有多少部分中有t个toy; 简单计算几何 需要判断的是点和直线的关系. 判断 某一点在直线左右侧 左右方向是相对前进方向的,只要指定…