先上正确的示例:

主要是设置我们的request的content-type为multipart/form-data

NSDictionary *param = @{@"assignee"     :self.userId,
@"projectName" :itemName.text,
@"proceedingName":Name.text,
@"content" :content.text,
@"urgency" :string
};
BaseNetwork *net = [BaseNetwork new];
[net.httpSessionManager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
[net uploadImageRequestURL:[NSString stringWithFormat:@"%@act/proceeding/start", GW_Domain] imageArray:self.imageArray parameters:param progress:^(float progress) {

其次是,将我们获取的imageArray(文件集合)按照web端(后台)的key约定,组装。【我们Java 后台的文件集合声明的key名称是files】

------至此,ios这边的代码就结束了。

Java后台:

controller层

  /**
* 发起申请(app)
*
* @param proceeding
* @return
*/
@ResponseBody
@RequestMapping("/start")
// @RequiresPermissions("act:proceeding:apply")
public R start(Proceeding proceeding) {
try {
// 启动事项审批工作流程
proceedingService.appStartProcess(proceeding, getUser());
return R.ok();
} catch (BDException e) {
LOGGER.error("app端发起事项审批流程异常", e);
return R.error(e.getMessage());
} catch (Exception e) {
LOGGER.error("app端发起事项审批流程异常", e);
return R.error();
}
}
Proceeding 载体bean
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import com.shengshi.common.domain.UploadFileDO;
import com.shengshi.common.exception.FileException;
import com.shengshi.common.utils.Base64Utils; public class Proceeding implements Serializable { private static final long serialVersionUID = 1L; /**
* 主键UUID
*/
private String id; /**
* 事项审批申请人
*/
private Long userId; /**
* 项目名称
*/
private String projectName; /**
* 事项名称
*/
private String proceedingName; /**
* 事项内容
*/
private String content; /**
* 缓急程度 0:常规 1:紧急 2:特级
*/
private String urgency; /**
* 创建时间
*/
private Date createTime; /**
* 事项审批状态 0:录入 1:审核中 2:审核通过 3:审核不通过
*/
private String status; /**
* 事项审批流程实例ID
*/
private String procInstId; /**
* 任务指定处理人
*/
private String assignee; /**
* 任务发起时间
*/
private Date applyTime; /**
* 上传文件列表,之所以没有规范为multipartfile是在get方法做了另外封装【要兼容移动端和app】
*/
private List<Object> files; /**
* 关联文件,多个用逗号分隔
*/
private String delIds; /**
* 上传文件记录列表
*/
private List<UploadFileDO> uploadFileList; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public Long getUserId() {
return userId;
} public void setUserId(Long userId) {
this.userId = userId;
} public String getProjectName() {
return projectName;
} public void setProjectName(String projectName) {
this.projectName = projectName;
} public String getProceedingName() {
return proceedingName;
} public void setProceedingName(String proceedingName) {
this.proceedingName = proceedingName;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public String getUrgency() {
return urgency;
} public void setUrgency(String urgency) {
this.urgency = urgency;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} public String getStatus() {
return status;
} public void setStatus(String status) {
this.status = status;
} public String getProcInstId() {
return procInstId;
} public void setProcInstId(String procInstId) {
this.procInstId = procInstId;
} public String getAssignee() {
return assignee;
} public void setAssignee(String assignee) {
this.assignee = assignee;
} public Date getApplyTime() {
return applyTime;
} public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
} public List<Object> getFiles() {
return files;
} public void setFiles(List<Object> files) {
this.files = files;
} //之所以封装这个方法,是因为我们需要兼容app(直接form表单提交,文件类型)和h5移动端(将文件用base64 encode一下,以字符串的形式传输)的文件上传
public List<MultipartFile> getFileList() throws FileException {
List<MultipartFile> list = new ArrayList<MultipartFile>();
if (files == null) {
return list;
}
for (Object obj : files) {
if (obj instanceof MultipartFile) {
list.add((MultipartFile) obj);
} else {// 移动app的from提交,文件为base64字符串
// 截取文件字符串 获取文件的类型和内容 base64文件的形式
// “data:image/jpeg;base64,kjkjfkj4k5j43kj34j34kj534k5j43j34kj5k34j5534kj5534j4”
// 这里再说明一下,如果将来对接android图片上传也采取base64方式的时候,
// 有可能解析文件不全,因为Java后台默认会把“+”(加号)替换成“ ”空格,接收的时候先把空格全部替换成“+”
String base64Img = obj.toString();
list.add(Base64Utils.base64ConvertFile(base64Img));
}
}
return list;
} public String getDelIds() {
return delIds;
} public void setDelIds(String delIds) {
this.delIds = delIds;
} public List<UploadFileDO> getUploadFileList() {
return uploadFileList;
} public void setUploadFileList(List<UploadFileDO> uploadFileList) {
this.uploadFileList = uploadFileList;
} }

------正确示例到此结束

我们出现的问题就是,ios端不小心将文件参数多封装了一层,如下:

NSDictionary *param = @{@"assignee"     :self.userId,
@"projectName" :itemName.text,
@"proceedingName":Name.text,
@"content" :content.text,
@"urgency" :string,
                 @"files" :data
};
BaseNetwork *net = [BaseNetwork new];
[net.httpSessionManager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
[net uploadImageRequestURL:[NSString stringWithFormat:@"%@act/proceeding/start", GW_Domain] imageArray:self.imageArray parameters:param progress:^(float progress) {

就是这个多给的参数,【files】. 后台得到的等于是key:files value:formdata。   本来要的是文件的格式,因为疏忽,导致后台一直按照字符串解析,匹配不成文件类型。记录一下。【本文图一已经对imageArray便利处理时加了相应的key,所以无需在form表单再去嵌套】

 

IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题的更多相关文章

  1. 文件上传(java web)

    文件上传: 对表单的要求: * method="post" * enctype="multipart/form-data" * 表单中需要添加文件表单项:< ...

  2. 前后端分离跨服务器文件上传-Java SpringMVC版

    近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...

  3. 【iOS】文件上传小记

    iOS由该系统提供API可以实现可以实现文件的上传和下载,有两种方法来. NSURLConnection与NSURLSession. 当中NSURLConnection是使用非常久的的一种方式.NSU ...

  4. jquery-ajax实现文件上传异常处理web.multipart.MultipartException

    异常如下: org.springframework.web.multipart.MultipartException: The current request is not a multipart r ...

  5. Selenium的文件上传JAVA脚本

    在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = drive ...

  6. springboot文件上传 流的方式 后台计算上传进度

    //代码 public static void main(String[] args) throws Exception { String path = "f:/svn/t_dictiona ...

  7. aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决

    upload ClientException Read timed out com.aliyun.openservices.ClientException: Read timed out        ...

  8. 记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化

    最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rf ...

  9. ios 多文件上传

    /** *  上传多个文件 * *  @param url      请求接口地址 *  @param filedata 文件名称和数据(key:value) *  @param btnName  上 ...

随机推荐

  1. linux内核中GNU C __attribute__ 机制的实用

    很多东西,只看看是不行的,要想深入的去了解一个东西,一定要去不断地学习,实践,反思. 说白了就是要去打磨. 在linux中,最近遇到了这样一个定义: int board_usb_init(int in ...

  2. Maven classifier 元素妙用

    首先来看这么一个依赖 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json- ...

  3. saltstack 初始化LINUX系统

    前面我们已经了解了saltstack的基础功能,现在就可以使用saltstack为初始化新安装的linux系统. 初始化列表: 1.关闭selinux 3.修改sshd配置文件 4.内核优化 5.ul ...

  4. Python常用模块time & datetime &random 模块

    时间模块前言 在Python中,与时间处理有关的模块就包括:time,datetime 一.在Python中,通常有这几种方式来表示时间: 时间戳 格式化的时间字符串 元组(struct_time)共 ...

  5. web自动化测试---概述

    最早的时候是做功能测试,web都是自己手工点击看看有没问题,没有系统的进行测试,更别说自动化测试了,那是一段不堪回首的往事,就是因为这,很多问题都流出去了,这是作为测试人员的一大失职,痛定思痛,开始学 ...

  6. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

  7. 在Windows环境中安装Neo4j

    图形数据库(Graph Database)是NoSQL数据库家族中特殊的存在,用于存储丰富的关系数据,Neo4j 是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边( ...

  8. golang逃逸分析和竞争检测

    最近在线上发现一块代码逻辑在执行N次耗时波动很大1ms~800ms,最开始以为是gc的问题,对代码进行逃逸分析,看哪些变量被分配到堆上了,后来发现是并发编程时对一个切片并发的写,导致存在竞争,类似下面 ...

  9. MongoDB-副本集搭建与管理

    目录 MongoDB 副本集 一.副本集概念 二.副本集部署 三 .副本集维护 四.注意事项 MongoDB 副本集 一.副本集概念 单节点的 MongoDB 在数据的安全和冗余方面是比较低的,在生产 ...

  10. vue-03-style与class

    1, 绑定html class 1), 直接绑定 <div> isActive 为true, 则显示 active css <p v-bind:class="{active ...