iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
在调试接口的时候,遇到一个问题,就是多张图片上传的时候,不管我上传多少张,只会上传成功最后一张,也就是说只有一张图片上传成功了,针对这个问题,通过查找资料,找到了原因,首先,在上传的过程中,我们获取到本地的image,会放到一个数组里面,在请求方法内进行上传,也就是说接口只调用一次,但是图片是在遍历完成后,一次性上传成功,现在的话,php后台的循环逻辑出现问题,走的还是单张上传逻辑,只是在外层添加了一个循环,这就直接导致了问题的存在,当然安卓那边是正常的,针对这种情况,有两种解决方法:
1,在php端,优化多张图片上传逻辑,然后兼容下单张上传的接口,
2,就是在ios端的上传多张图片的接口,进行代码的优化,把请求提内的遍历,放到外层,然后每上传一张图片就调用一次接口,当然这是种笨办法,因为php后台无法及时处理,只能在前台做优化了,
找后台调试后发现,通过上面的方法上传多张图片,实际上只有一张被传到后台,可能的原因是:
上传多张图片时,由于url的参数没有变化,iOS默认是同一个请求,只发送了一次请求给后台,故后台只收到一张图片。
废话不说了,直接上代码:
正常的上传图片的方法:
- AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
- manager.requestSerializer.timeoutInterval = ;
- 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 = ; 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 = ; i < headImage.count; i++)
- {
- AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
- manager.requestSerializer.timeoutInterval = ;
- 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
iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片的更多相关文章
- iOS开发:(线程篇-上)线程和进程
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发中获取视图在屏幕上显示的位置
在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...
- ios开发--集成银联3.3.0
项目最近需要集成银联,在网上搜了一下发现都并不是最新版的银联集成教程,自己摸索了一下,总结写了下来. 附上3.3.0的下载网址 https://open.unionpay.com/upload/dow ...
- iOS开发之第三方登录微信-- 史上最全最新第三方登录微信方式实现
项目地址 : https://github.com/zhonggaorong/weixinLoginDemo 最新版本的微信登录实现步骤实现: 1.在进行微信OAuth2.0授权登录接入之前,在 ...
- iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现
相关资源地址: 本项目demo地址 : https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载: 最新微博SDK 官网注册地址:点击打开链接 最新 ...
- iOS开发系列之性能优化(上)
本篇主要记录一下我对界面优化上的一些探索.关于时间优化的探索将会在中篇里进行介绍.下篇将主要介绍一些耗电优化.安装包瘦身的探索. ### 1.卡顿原理 要了解卡顿原理,需要对帧缓冲区.垂直同步.CPU ...
- iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现
项目地址 : https://github.com/zhonggaorong/QQLoginDemo/tree/master 最新版本的qq登录实现步骤实现: 1. 首先,你需要去向腾讯申请账号. ...
- ios开发3.5和4.0寸屏幕自适应中的一点问题
在开发iso应用中需要考虑到ip4的3.5寸屏幕和ip5的4寸屏幕的高度不一样的问题.常见的问题有滚动条位置,底部被挡住等情况:我遇见是tableview中添加下拉上提刷新功能时刷新指示器显示位置的问 ...
- iOS开发--Swift 基于AFNetworking 3.0的网络请求封装
Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...
随机推荐
- NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
本篇文章由:http://xinpure.com/nsurlsessionnsurlconnection-http-load-failed-kcfstreamerrordomainssl-9802/ ...
- Solr之困
http://www.kafka0102.com/2010/08/319.html重写公司的站内搜索.经过前期一段时间对lucene和solr的熟悉,最后决定使用Solr作为新系统的基础框架.现在已经 ...
- 使用VS2012遇到的问题
问题1:VS2012 编译程序时:无法查找或打开PDB文件 解决方法:调试-选项-符号-Microsoft符号服务器打钩,然后确定,就OK了. 问题2:按F5运行.c程序,dos窗口闪退 解决方法:C ...
- JavaScript之Web通讯
web通信,一个特别大的topic,涉及面也是很广的.因最近学习了 javascript 中一些 web 通信知识,在这里总结下.文中应该会有理解错误或者表述不清晰的地方,还望斧正! 一.前言 1. ...
- apache 静态编译和动态编译参考
apache-2.2.22 编译安装笔记 一.静态编译 在使用./configure 编译的时候,即没有使用--enable-mods-shared=[module]或者--enable-[m ...
- Spring Cloud(三):服务提供与调用
上一篇文章我们介绍了eureka服务注册中心的搭建,这篇文章介绍一下如何使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例. 案例中有三个角色:服务注册中心.服务提 ...
- centos系统字符编码问题
1.cat /etc/locale.conf LANG="en_US.UTF-8" 2./etc/profile.d/lang.sh这个文件要有且可以正常执行(检查/sbin/co ...
- tcpdump常用参数说明
(一).学习tcpdump的5个参数 初次使用tcpdump时,使用tcpdump -h命令可以看到它有数十个参数. 根据我们在运维工作中的经验,掌握tcpdump以下5个参数即可满足大部分的工作需要 ...
- 解决将Ubuntu下导出的requirements.txt到Centos服务器上面出现pkg-resource的版本为0.0.0
最直接有效的方法: 原因:
- python学习笔记(9)--Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法 这篇文章主要介绍了Python UnicodeEncodeErro ...