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

最新文章

  1. video标签播放视频
  2. 还原MySql数据库失败:max_allowed_packet 设置过小导致记录写入失败
  3. 远程连接redis
  4. javascript应用之如何判断一个数为素数
  5. ABAP 承运路单
  6. java web(三) Tomcat虚拟目录映射方式
  7. Pycharm 介绍
  8. LIS检验系统,简介及主要特点
  9. 异步导出excel
  10. linux编译安装git
  11. python三级菜单的实现
  12. 普及下Oracle hints语法
  13. 合并多个python list以及合并多个 django QuerySet 的方法
  14. 编写简单的 NT 式驱动程序的加载与卸载工具
  15. wordpress函数技巧
  16. OOM实例
  17. 2018-2019-2 20165313 Exp3 免杀原理与实践
  18. .net core 监听性能,异常
  19. C++11 中的function和bind、lambda用法
  20. Content of &quot;Essential Software Test Design&quot;

热门文章

  1. Django的CBV与FBV
  2. Dapper 中使用sql in 关键字查询
  3. Python --标准库 存储对象 (pickle包,cPickle包)
  4. Oracle XE安装具体解释
  5. Java Socket网络编程Server端详解
  6. Android中MVC、MVP、MVVM具体解释
  7. mysql 开启慢查询 如何打开mysql的慢查询日志记录
  8. Ubuntu环境下使用npm安装node模块时报错的处理方法
  9. FreeRTOS基础知识
  10. 记一次log4j日志导致线上OOM问题案例