• iOS上传图片问题


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

    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 == 0) {
                NSMutableString *str = [NSMutableString string];
                 [formData appendPartWithFormData:[[str copy] dataUsingEncoding:NSUTF8StringEncoding] name:@"noImgid"];
            }
            else {  // 存在图片上传
                for (NSInteger i = 0; 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:@"000"]) {
                [SVProgressHUD showSuccessWithStatus:@"提交成功"];
            }
            else {
                [SVProgressHUD showErrorWithStatus:@"提交失败"];
            }
        } failure:^(NSError *error) {
            [SVProgressHUD showErrorWithStatus:@"提交失败"];
        }];
    }

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

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

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

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

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

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

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

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

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

    查看了下JAVA的异常返回:

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    Sql获取当前用户可以访问的数据库名
    MSChart中转义符
    PhoneGap 调用activity中的方法
    爬hao123应对不同页面不同编码
    C#调用脚本语言(三) IronJS 与 IronLua 简单方法性能比较
    Sailfish预研结果
    phonegap开发者需要注意喽,小心图片外链
    IOS 5 解析Json
    C#调用脚本语言(二) IronJS基本语法
    使用phonegap,进行页面跳转
  • 原文地址:https://www.cnblogs.com/pengsi/p/6050608.html
Copyright © 2020-2023  润新知