Spring Boot Multipart文件上传报500内部服务器错误求助
问题描述
基于Maven构建的Spring Boot项目,实现文件上传接口时调用出现500 Internal Server Error。
错误信息
Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
原因分析
- 配置冲突:手动配置了Spring MVC的
CommonsMultipartResolver,但Spring Boot默认使用StandardServletMultipartResolver,两者冲突导致Multipart配置未正确加载。 - 依赖冗余:pom.xml同时引入
spring-webmvc和spring-boot-starter-web,后者已包含spring-webmvc,重复引入引发依赖混乱。 - 启动配置缺失:war打包的Spring Boot项目未正确继承
SpringBootServletInitializer,导致容器无法识别Spring Boot的自动配置,包括Multipart配置。
解决方案
1. 清理冗余依赖
修改pom.xml,移除以下不必要的依赖:
<!-- 移除重复的spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.21.RELEASE</version> </dependency> <!-- 移除commons-fileupload和commons-io,Spring Boot默认不需要 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
2. 删除自定义MultipartResolver配置
修改SpringApplicationConfig.java,移除multipartResolver Bean的定义,让Spring Boot自动配置:
package awsarTest.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; @ComponentScan(basePackages = "awsarTest.controller") @Configuration @EnableWebMvc public class SpringApplicationConfig { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver vw = new InternalResourceViewResolver(); vw.setPrefix("/WEB-INF/jsp/"); vw.setSuffix(".jsp"); return vw; } // 移除下面的multipartResolver Bean }
3. 添加Spring Boot启动类
如果项目没有启动类,创建一个继承SpringBootServletInitializer的启动类,适配war打包:
package awsarTest; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class AwsarTestApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(AwsarTestApplication.class, args); } }
4. 保留Multipart配置
application.properties中的Multipart配置可以继续使用,Spring Boot会自动读取并应用:
# MULTIPART (MultipartProperties) # Enable multipart uploads spring.servlet.multipart.enabled=true # Threshold after which files are written to disk. spring.servlet.multipart.file-size-threshold=2KB # Max file size. spring.servlet.multipart.max-file-size=200MB # Max Request Size spring.servlet.multipart.max-request-size=215MB
5. 验证Controller代码
确保Controller的上传方法参数正确,可修正方法名拼写(非必须,但更规范):
@PostMapping(value = "/upload") public String uploadDocument(@RequestParam("file") MultipartFile file) { String fileName = file.getOriginalFilename(); System.out.println("Received file: " + fileName); return fileName; }
测试
重新打包部署项目,使用Postman调用接口http://localhost:6061/awsarTest/auth/upload,确保请求的Content-Type设置为multipart/form-data,并正确选择文件后发送请求。
内容的提问来源于stack exchange,提问作者Arunraj Chandran

