Tomcat文件上传出现FileNotFoundException问题求助
处理Spring Multipart请求控制器异常的常见方案
首先先把你给出的控制器代码格式化一下,方便排查:
@RequestMapping(value = "/{id}/projects", method = RequestMethod.POST, consumes = "multipart/form-data") public ResponseEntity<Project> addProject(@PathVariable Long id, @RequestParam("file") MultipartFile file, @ModelAttribute CreateProjectDTO projectDto) throws URISyntaxException, ResourceNotFoundException { // 无业务逻辑仍抛出异常 }
看到你说即使控制器里没做任何操作也出现异常,但没贴全完整的异常栈信息,我先列几个这类场景下最常遇到的问题和对应的解决办法,你可以对照排查:
1. MultipartResolver未正确配置
Spring默认不会自动注册MultipartResolver(除非是Spring Boot自动配置场景),如果缺少这个bean,容器无法解析multipart/form-data类型的请求,会直接抛出异常。
解决办法:
在你的Spring配置类中显式声明这个bean:
@Bean public MultipartResolver multipartResolver() { return new StandardServletMultipartResolver(); }
如果是用XML配置的话,添加:
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
2. 请求参数与控制器参数不匹配
比如前端传递的文件参数名不是file,或者CreateProjectDTO的字段和前端表单里的参数名不对应,导致参数绑定失败抛出异常。
解决办法:
- 检查前端表单:确保文件输入框的
name属性是file,和@RequestParam("file")的参数名完全一致(注意大小写敏感)。 - 检查
CreateProjectDTO:如果表单里的其他参数和DTO字段名不一致,可以给DTO字段添加@RequestParam指定映射,或者用@JsonProperty(如果是混合JSON的表单请求)。
3. 文件大小超出限制
如果上传的文件超过了Spring或Servlet容器的默认大小阈值,会抛出MaxUploadSizeExceededException相关异常。
解决办法:
Spring Boot项目直接在配置文件设置:
# 单个文件最大大小 spring.servlet.multipart.max-file-size=10MB # 整个请求的总大小限制 spring.servlet.multipart.max-request-size=50MB
普通Spring MVC项目可以通过配置类设置:
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setMaxFileSize(DataSize.ofMegabytes(10)); factory.setMaxRequestSize(DataSize.ofMegabytes(50)); return factory.createMultipartConfig(); }
4. 缺少Multipart相关依赖
如果是普通Spring MVC项目,要确保spring-web依赖已经正确引入,版本和其他Spring组件保持一致;如果是Spring Boot项目,spring-boot-starter-web已经包含了所需依赖,一般不用额外添加,但如果依赖缺失也会导致解析失败。
如果能把完整的异常栈信息贴出来,我可以更精准地帮你定位问题~
内容的提问来源于stack exchange,提问作者john deer
相关产品推荐
相关产品推荐

