解决这个问题前先普及一下Spring Boot是如何解析form-data的,Spring Boot通过MultipartResolver接口来解析multipart/form-data类型请求,该接口有两个实现类CommonsMultipartResolver和StandardServletMultipartResolver,下面我们来分别看一下这两个实现类
1、CommonsMultipartResolver
CommonsMultipartResolver是基于Apache Commons FileUpload库实现的。它使用Jakarta Commons FileUpload来解析multipart/form-data请求。这个解析器可以在application.properties或application.yml文件中通过配置spring.servlet.multipart.resolver属性来启用。但是在springboot 3.x中,该实现类已被弃用。
2、StandardServletMultipartResolver
StandardServletMultipartResolver是Spring Boot默认的MultipartResolver实现。它依赖于Servlet 3.0规范提供的API来解析multipart/form-data请求。当没有显式配置其他MultipartResolver时,Spring Boot会自动使用这个解析器。
刚才已经说明了,springboot3只支持StandardServletMultipartResolver,所以如果遇到form-data无法解析的情况,就是StandardServletMultipartResolver没有被加载,StandardServletMultipartResolver加载是由MultipartAutoConfiguration来实现的,贴上代码如下
从代码中可以看到MultipartAutoConfiguration被加载的关键是 spring.servlet.multipart.enabled
这个配置项,经过排查发现,原因是springboot升级前项目使用的是CommonsMultipartResolver,所以将 spring.servlet.multipart.enabled
设为false了,将该配置项改为true问题解决!如果不是这个原因,那么你需要排查一下项目中是否自定义实现MultipartResolver接口。
评论 (0)