所以我是 Spring 的新手,我正在尝试为我的项目上传文件(顺便说一句,我正在使用 Spring Tool Suite。)并且在提交表单时,我得到的是:
HTTP 状态 500 - 无法解析多部分 servlet 请求;嵌套异常是 java.lang.IllegalStateException:无法处理部件,因为没有提供多部件配置
来自浏览器的堆栈跟踪:
类型异常报告
消息无法解析多部分 servlet 请求;嵌套异常是 java.lang.IllegalStateException:无法处理部件,因为没有提供多部件配置
说明 服务器遇到内部错误,无法完成此请求。
例外
org.springframework.web.multipart.MultipartException:无法解析多部分 servlet 请求;嵌套异常是 java.lang.IllegalStateException:无法处理部件,因为没有提供多部件配置
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:100)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:78)
org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:75)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
根本原因
java.lang.IllegalStateException:无法处理部件,因为没有提供多部件配置
org.apache.catalina.connector.Request.parseParts(Request.java:2676)
org.apache.catalina.connector.Request.getParts(Request.java:2643)
org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1083)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:85)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:78)
org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:75)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
note Apache Tomcat/8.0.27 日志中提供了根本原因的完整堆栈跟踪。
这是jsp中的表单标签:
<form:form class="form-horizontal" role="form" method="post"
action="newArtist.html" modelAttribute="artist" enctype="multipart/form-data">
输入部分:
<div class="form-group">
<div class="col-lg-3">
<label for="photo">Artist photo:</label>
<form:input type="file" id="photo" path="photo"></form:input>
</div>
</div>
照片存储在艺术家对象的这个字段中:
@Lob
private byte[] photo;
控制器映射方法:
@RequestMapping(value = "/newArtist", method = RequestMethod.GET)
public String showAddArtistForm(Model model)
{
model.addAttribute("artist", new Artist());
return "newArtist";
}
@RequestMapping(value = "/newArtist", method = RequestMethod.POST)
public String addArtist(@ModelAttribute("artist") @Valid Artist artist, BindingResult result,
@RequestParam("photo") MultipartFile photo) throws IOException
{
if (result.hasErrors())
return "newArtist";
if(photo.getBytes() != null)
artist.setPhoto(photo.getBytes());
artistService.addArtist(artist);
return "redirect:artists.html";
}
servlet-context.xml 中的多部分解析器配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>
web.xml 中的过滤器:
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
依赖项:
<!-- Apache Commons FileUpload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Apache Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
我还将 Tomcat 的配置文件 context.xml 导入到 META-INF/context.xml 并像这样编辑 Context 标签:
<Context allowCasualMultipartParsing="true">
似乎没有任何效果,我们将不胜感激任何帮助。
原文由 kbijoch 发布,翻译遵循 CC BY-SA 4.0 许可协议
实际上,您不需要 web.xml 上的任何过滤器来使用 Spring MVC 上传您的多部分文件。我在我的项目中有相同的配置并且它有效(${spring.version} = 4.3.4.RELEASE):
聚甲醛
HTML
弹簧上下文
弹簧控制器