SpringMVC接收不到前端FormData对象属性问题的解决

2018年02月23日 99 字 教程整理


问题描述: SpringMVC的服务端获取通过FormData提交的参数时候;如果采用GET方式,服务端可以接收参数的值; 而采用POST方式的时候,却始终接收不到参数的值而报错。

解决方案如下:

0.1. 问题分析

查阅相关资料发现,这是form表单的enctype编码方式不同导致的。

enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。如果使用GET,则强制使用application/x-www-form-urlencoded”方式。

在本文所用代码中有强制使用multipart/form-data的数据传递方式,所以SpringMVC中获取不到POST形式的参数。

0.2. 解决方案

先总结一下表单的两种编码的形式:

application/x-www-form-urlencoded空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值
multipart/form-data不对字符进行编码,使用二进制数据传输,一般用于上传文件,非文本的数据传输。

SpringMVC如果一定要以POST方式接收 multipart/form-data 传输的数据,应该在Spring的配置文件上下文配置:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">   
</bean>

同时需要将commons-fileupload-x.x.x.jar和commons-io-x.x.jar两个包文件引入到项目中。

这样服务端就既可以接收multipart/form-data 传输的数据,也可以接收application/x-www-form-urlencoded传输的文本数据了。

【注】SpringMVC如需接收File文件,要以Spring提供的读取文件的类CommonsMultipartFile进行接收。如:

public String doAction(@RequestParam("sealPfxFile") CommonsMultipartFile sealPfxFile, Seal seal, ModelMap modelMap, HttpServletRequest request) throws Exception {
  //上传文件名
  String fileName = sealPfxFile.getFileItem().getName();
  //上传文件流
  InputStream is = sealPfxFile.getInputStream();
}