提交enctype=multipart/form-data表单时控制器如何获取表单数据
问题原因
使用multipart/form-data类型的表单提交时,Spring MVC默认没有开启文件上传解析器,导致请求中的普通表单字段和文件字段都无法被正确解析,也就不能绑定到@ModelAttribute注解的对象上。
解决步骤
1. 引入文件上传依赖
普通Spring MVC项目需要先引入commons-fileupload依赖,Maven配置如下:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
Spring Boot项目的spring-boot-starter-web已经默认集成了相关依赖,不需要额外引入。
2. 配置Multipart解析器
Spring MVC XML配置方式
在Spring上下文配置文件中添加固定id为multipartResolver的Bean:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 配置最大上传文件大小,单位字节,示例为10MB --> <property name="maxUploadSize" value="10485760"/> <!-- 请求编码格式,需和前端页面编码保持一致 --> <property name="defaultEncoding" value="UTF-8"/> </bean>
注意Bean的id必须是multipartResolver,Spring会按这个固定id查找解析器,写错不会生效。
Spring Boot配置方式
可以直接在配置类中注册Bean:
@Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10485760); resolver.setDefaultEncoding("UTF-8"); return resolver; }
也可以直接在application.yml/application.properties中配置参数:
spring: servlet: multipart: enabled: true max-file-size: 10MB max-request-size: 10MB
3. 嵌套对象初始化校验(可选)
如果配置完成后仍拿不到值,检查EmployeeUpdateForm类中的ContactInfo对象是否提前初始化:
public class EmployeeUpdateForm { private String name; private ContactInfo info = new ContactInfo(); // 提前初始化嵌套对象,避免绑定失败 // 标准getter和setter方法 }
Spring绑定嵌套对象时,如果外层对象中的嵌套属性为null,会出现绑定失败的情况。
以上配置完成后重启项目,提交表单即可正常获取所有字段值。
内容的提问来源于stack exchange,提问作者acon24
相关产品推荐
相关产品推荐

