问题描述: 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();
}