You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:24:06