Spring MVC Ajax图片上传报错:Unable to process parts as no multi-part configuration has been provided
解决Spring MVC Ajax文件上传报错"Unable to process parts as no multi-part configuration has been provided"
核心问题分析
你使用的StandardServletMultipartResolver依赖Servlet容器的multipart配置,但当前项目未在Servlet层面配置文件上传相关参数,导致容器无法处理multipart请求。此外,pom.xml中存在Servlet API依赖冲突,也可能引发问题。
分步解决方案
1. 修复pom.xml依赖冲突
Spring 6.x基于Jakarta EE 9+,需移除javax.servlet-api依赖,保留jakarta.servlet-api即可:
<!-- 删除以下依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
2. 解决Multipart配置问题(二选一)
方案一:配置Servlet容器的Multipart参数(适用于StandardServletMultipartResolver)
在web.xml中为Spring MVC的DispatcherServlet添加<multipart-config>配置:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <!-- 添加multipart配置 --> <multipart-config> <max-file-size>10485760</max-file-size> <!-- 10MB --> <max-request-size>20971520</max-request-size> <!-- 20MB --> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet>
方案二:切换为CommonsMultipartResolver(无需Servlet容器配置)
由于你已引入commons-fileupload依赖,可将servlet.xml中的multipartResolver替换为CommonsMultipartResolver:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 可选:设置最大上传文件大小 --> <property name="maxUploadSize" value="10485760"/> <!-- 10MB --> </bean>
3. 优化后端Controller代码(可选)
可以直接通过@RequestParam接收文件,代码更简洁:
@Controller @RequestMapping("api/") public class APIController { @Autowired ServletContext servletContext; @PostMapping("uploadfile") @ResponseBody public String upLoadFile(@RequestParam("file") MultipartFile file) { String pathToProducts = servletContext.getRealPath("/resources/Image/"); File saveDir = new File(pathToProducts); // 确保目录存在 if (!saveDir.exists()) { saveDir.mkdirs(); } File fileSave = new File(pathToProducts + File.separator + file.getOriginalFilename()); try { file.transferTo(fileSave); } catch (IOException e) { e.printStackTrace(); return "上传失败"; } return "上传成功"; } }
4. 前端代码优化(可选)
变量声明使用let/const避免全局变量污染:
$(document).ready(function(){ $("#productPhotos").change(function(event){ const files = event.target.files; const formData = new FormData(); formData.append("file", files[0]); $.ajax({ url: "/shophai/api/uploadfile", type: "POST", data: formData, contentType: false, processData: false, success: function (value) { console.log("上传结果:", value); }, error: function(xhr) { console.error("上传失败:", xhr.responseText); } }) }); });
内容的提问来源于stack exchange,提问作者do hai
相关产品推荐
相关产品推荐

