今天一定得写一篇博客,有以下原因:

1>第一次做图片上传的功能,算是一种记录吧;

2>在这个问题上,纠结,迷茫了很久,主要还是被后台坑了;

1.上传图片的方法是用的AFNetWorking的方法,在他的基础上再次封装了一次:

主要是后台要求参数放path,图片放body,queryString放在url上,只是用表单传文件参数:

+ (NSURLSessionUploadTask *)uploadFileWithURLString:(NSString *)urlString queryParameter:(id)parameters formConstructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block progress:(nullable void (^)(NSProgress * _Nonnull))progress success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// manager.responseSerializer = [AFHTTPResponseSerializer serializer];
if (parameters) {
NSString *queryString = AFQueryStringFromParameters(parameters);
urlString = [urlString stringByAppendingFormat:@"?%@", queryString];
} NSURLSessionUploadTask *uploadTask = (NSURLSessionUploadTask *)[manager POST:urlString parameters:nil constructingBodyWithBlock:block progress:progress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
return uploadTask;
}

2.提交数据的代码如下所示:

#pragma mark - 提交按钮被点击

- (void)commitButtonDidClick {

    // 结束编辑
[self.view endEditing:YES];
if (![self.scannerLogModel.name isNotBlank]) {
[SVProgressHUD showErrorWithStatus:@"请选择资产名称"];
return;
}
if (![self.scannerLogModel.code isNotBlank]) {
[SVProgressHUD showErrorWithStatus:@"请选择资产编号"];
return;
}
if (![self.scannerLogModel.statusId isNotBlank] || (![self.scannerLogModel.status isNotBlank])) {
[SVProgressHUD showErrorWithStatus:@"请选择资产状态"];
return;
}
if (![self.scannerLogModel.num isNotBlank]) {
[SVProgressHUD showErrorWithStatus:@"请选择数量"];
return;
}
if (![self.scannerLogModel.price isNotBlank]) {
[SVProgressHUD showErrorWithStatus:@"请选择金额"];
return;
}
if ([NSString deptIdInputShouldAlphaNum:self.scannerLogModel.code]) {
[SVProgressHUD showErrorWithStatus:@"资产编号只能输入字母和数字"];
return;
} // 提交录入数据
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeClear];
[SVProgressHUD showWithStatus:STR_REQUEST_LOADING];
NSDate *date = [NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"YYYY-MM-dd"];
NSString *dateString=[dateformatter stringFromDate:date];
NSLog(@"dateString:%@",dateString); // 拼接输入和选择的内容字符串
NSDictionary *valDic = @{@"code" : self.scannerLogModel.code ? : @"",
@"name" : self.scannerLogModel.name ? : @"",
@"orgid" : @"efadaefd58da4632b04b315526a4b2fe",
@"type" : @"",
@"status" : self.scannerLogModel.statusId ? : @"",
@"outdate" : dateString ? : @"",
@"buydate" : dateString ? : @"",
@"strdate" : dateString ? : @"",
@"price" : self.scannerLogModel.price ? : @"",
@"qualitydate" : @"",
@"num" : self.scannerLogModel.num ? : @"",
@"e1d12854969444febf2d39f5b1c805f6" : @"",
@"2893a739814e481d83ccf71d716426d5" : @"",
@"7f2068f55219486aa810989c6f7c6f48" : @"",
@"a8c84c6799d94372a4f281710085eb06" : @"",
@"10e4810aa89a49d0ae1570039cddf158" : @"",
@"contract" : @"",
@"supplier" : self.scannerLogModel.supplierId ? : @"",
@"suppliername" : self.scannerLogModel.suppliername ? : @"",
@"company" : self.scannerLogModel.company ? : @"",
@"companyname" : self.scannerLogModel.companyname ? : @"",
@"model" : self.scannerLogModel.model ? : @"",
@"modelname" : self.scannerLogModel.modelname ? : @"",
@"modelsize" : self.scannerLogModel.modelsize ? : @"",
@"managedep" : self.scannerLogModel.managedep ? : @"",
@"usedep" : self.scannerLogModel.usedep ? : @"",
@"useperson" : self.scannerLogModel.usepersonId ? : @"",
@"usepersonname" : self.scannerLogModel.useperson ? : @"",
@"area" : self.scannerLogModel.areaId ? : @"",
@"build" : self.scannerLogModel.buildId ? : @"",
@"room" : self.scannerLogModel.roomId ? : @"",
@"remark" : self.scannerLogModel.remark ? : @""
}; // 字典转化为JSON字符串
NSString *valStr = [NSString DataTOjsonString:valDic];
NSDictionary *param = ZCGetScannerLoggingParameter([User sharedUser].userid, [User sharedUser].orgInfo.orgid, [User sharedUser].defaultRole.roleid , [User sharedUser].token, valStr);
[HTTPTool uploadFileWithURLString:SCANNER_LOGGING_URL queryParameter:param formConstructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 没有图片也要传file,否则也是提交失败
if (self.selectedImageArray.count == ) {
NSMutableString *str = [NSMutableString string];
[formData appendPartWithFormData:[[str copy] dataUsingEncoding:NSUTF8StringEncoding] name:@"noImgid"];
}
else { // 存在图片上传
for (NSInteger i = ; i < self.selectedImageArray.count; i++) {
if ([self.selectedImageArray[i] isKindOfClass:[UIImage class]]) {
UIImage *image = self.selectedImageArray[i];
NSData *data = [image compressedData];
NSString *imageFileContentType = [NSData sd_contentTypeForImageData:data];
NSString *fileName = nil;
// 注意: 只能提交.png的图片,其他图片都会返回图片提交失败
// if (imageFileContentType) {
// NSRange range = [imageFileContentType rangeOfString:@"image/"];
// NSString *extensionName = [imageFileContentType substringFromIndex:NSMaxRange(range)];
// fileName = [NSString stringWithFormat:@"%zdxx.%@", i, extensionName];
// } else {
imageFileContentType = @"image/png";
fileName = [NSString stringWithFormat:@"%zdxx.png", i];
// }
[formData appendPartWithFileData:data name:@"file[]" fileName:fileName mimeType:imageFileContentType];
}
}
}
} progress:nil success:^(id responseObject) {
if ([responseObject[@"code"] isEqualToString:@""]) {
[SVProgressHUD showSuccessWithStatus:@"提交成功"];
}
else {
[SVProgressHUD showErrorWithStatus:@"提交失败"];
}
} failure:^(NSError *error) {
[SVProgressHUD showErrorWithStatus:@"提交失败"];
}];
}

3.在当初提交,一直提交失败,并且报错如以下所示:

可能不清晰,意思就是图片错误,导致提交图片不成功....

在试了很多次,试了很多方法的情况下,只能找后台看看原因了,结果是每次提交图片都上传成功了,就是提示图片错误...

后面尝试上传.png的图片,嘿嘿....提交成功了....

这时才明白,原来只接受.png的图片,其他的类型图片一律报图片错误...

所以....这个问题上后台坑了一上午啊...表示宝宝不开心...呜呜呜!!!

4.提交图片成功了,可是当不传图片,只传基本信息的时候又报500的错误,我的第一反应就是服务器错误...哈哈哈....

和后台联调才发现是上传参数错误,当没有图片时file参数还是必须传,只是图片直接为空就好了...<也就是formdata还是要有的.....>

然而直接写空返回以下错误异常:

查看了下JAVA的异常返回:

,字符串越界错误 java.lang.StringIndexOutOfBoundsException等字符串类相关错误 

代码段4:
String s_all_power = "";
String s_access_power = s_all_power.substring(,);
描述:
以上代码段功能的功能是获取字符串s_all_power中的第4个字符。
说明:
一般情况下,程序不会有问题,如果由于某种原因,s_all_power长度变短,程序就会抛出字符串错误。
解决方案:对字符串进行截取(substring, charAt)、转换为字节数组(getBytes),字符数组转换为字符串(valueOf)操作时,先对操作字符串对象的存在性(是否为空)及长度进行检查后,再进行操作。
改写得到:
String s_all_power = "";
if (s_all_power.length>)
String s_access_power = s_all_power.substring(,);

表示我也没看懂,就知道字符串越界:

然而我尝试了下各种写法,终于以下写法正确了,提交成功了:

 // 没有图片也要传file,否则也是提交失败
if (self.selectedImageArray.count == ) {
NSMutableString *str = [NSMutableString string];
[formData appendPartWithFormData:[[str copy] dataUsingEncoding:NSUTF8StringEncoding] name:@"noImgid"];
}

哎...苦逼的心情终于好了....

对这次遇到的问题有很多的感悟,总结下来就是以下几点:

1.对AFNetWorking框架的底层实现非常不熟悉,需要好好理解下源码了;

2.对上传图片的认识不清晰,甚至是path,body的认识不清晰;

3.遇到数据提交请求问题,是在解决不了的时候,还是要和后台沟通问题,联调接口,这样才能找到问题的所在,找到根本原因呀.....

虽然成功完成的有点曲折,不过毕竟是自己第一次做提交图片的功能,还是很高兴的,相信在之后的工作中自己懂的更多了.....

总之,还是自己技术不牛,底层源码实现了解不透彻,所以,以后再用第三方框架的时候,还是要熟悉熟悉源码,这样自己使用起来也更得心应手了!!!

加油,做更好的自己!加油成长吧!!!

iOS上传图片问题的更多相关文章

  1. IOS上传图片方法类

    IOS上传图片方法类   iPhone开发中遇到上传图片问题,找到多资料,最终封装了一个类,请大家指点,代码如下 // // RequestPostUploadHelper.h // demodes ...

  2. ios上传图片显示方向错误问题

    IOS 上传图片方向显示错误问题 问题描述 在使用苹果手机上传图片的时候,发现传完的图片显示出来方向是错误的,竖着的图片会变成横着显示(少部分安卓手机也存在这个问题) 产生原因 ios 相机加入了方向 ...

  3. IOS上传图片

    //原文地址http://www.cnblogs.com/skyblue/archive/2013/05/08/3067108.html,因为以后要用到,搬来存下// // RequestPostUp ...

  4. iOS上传图片详解

    iphone中图像通常存储在4个地方[相册.应用程序包.沙盒.Internet],通过这4个源,我们就可以存取应用图片. 相册 iphone的相册包含摄像头胶卷+用户计算机同步的部分照片.用户可以通过 ...

  5. iOS上传图片和视频(base64和file)

    前言:iOS开发中经常会使用到图片和视频上传及保存到相册,下面我讲介绍视频图片的两种上传服务器的方法.以阿里云的OSS服务器为例. 友情提示:上传图片方法在APP中使用很广泛,最好单独写一个图片上传的 ...

  6. 微信网页IOS上传图片旋转解决方案

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. vue iOS上传图片file 出错

    前言 用vue 移动端上传图片在低版本的 ios 手机上 图片转换base64 在转换file 文件类型 会报错 并且报错 “Script Error ” 查阅了github 和一些文档发现 可以吧 ...

  8. IOS上传图片方向问题

    在显示上传完毕的图片的时候遇到了一个问题, 图片莫名其妙被逆时针旋转了90度就很离谱 如下图 经过一番查询, 原来是 IOS 的相机拍照的时候会把方向角写入到图片里面 因为我用的是 element 的 ...

  9. ios上传图片遇见了一个TimeoutError(DOM Exception 23)异常

    TimeoutError(DOM Exception 23):The operation timed out 百度了下,没发现解决办法

随机推荐

  1. 学习使用C语言实现线性表

    线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结 构体或对象.例如:1,2,3,4,5是一个线性表,A, ...

  2. Vim——替换命令

     原创声明:本文系博主原创文章,转载或引用请注明出处. 1. 文本替换 #替换每一行的第一个a :%s/a/b/ #全部替换 :%s/a/b/g #替换/时需要转义"\/" 2. ...

  3. 用锁实现SQLSERVER中简单并发控制(转)

    研究Oracle的同学都知道,Oracle的select语句中可以使用for update或者for update nowait来控制并发,这一功能可以使开发人员轻易的将锁定控制在会话级+行级,可以说 ...

  4. Appium简介以及环境安装

    官网地址 Appium 是一个自动化测试开源工具,支持多平台上的原生应用,web应用和混合应用,是由appium server和appium Client两部分组成通过json wire protoc ...

  5. @Mapper和@Repository

    参考地址 https://www.cnblogs.com/jtfr/p/10962205.html 相同点 两者都是作用于dao上 不同点 @Repository需要在Spring中配置扫描地址,然后 ...

  6. 用github page为自己的项目编写文档

    ———————————————— 一.用md文件建立网页这一步要做的就是把四个实验报告做出来.1.首先为了方便管理,我们在ML下创建一个名为docs的文件夹. 2.然后在修改设置,让github从do ...

  7. yii项目连接多个数据库时, MySQL报错No such file or directory

    服务器错误 yii\db\Exception SQLSTATE[HY000] [2002] No such file or directory ###'xxx是项目根目录' #0 xxx/vendor ...

  8. join on 和group

                       左边的表是article文章表,右边的是comment文章回复表. 今天mysql查询的时候,遇到了有趣的事,任务是查询数据库需要得到以下格式的文章标题列表,并按 ...

  9. 2g 大文件上传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  10. EasySwoole 在mac上装虚拟机centos共享mac目录报错处理

    [2019-09-26 21:37:09][DEBUG][ERROR] : [listen /media/psf/Home/wwwroot/myobj/easyswoole/Temp/TaskWork ...