背景:
SpringMVC項目需要上傳文件。於是按照下面的步驟操作了。但是還是遇到了問題。
第一步,在application-context.xml添加了如下的代碼
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
第二步,然後在Controller裏面添加接收file上傳的代碼如下
@RequestMapping(value = "/file/upload",method = RequestMethod.POST)
@Response
public BaseResult fileUpload(@RequestPart("file") MultipartFile file , HttpServletRequest request) throws IOException {
File serverFile = UploadUtils.saveFile(file);
return new DataResult(result);
}
第三步,用POST發上傳文件的請求
但是。Web服務拋錯。異常如下。注意看異常。
multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
[dart-backend]15:36:31 506 ERROR (com.ximalaya.mobile.common.exception.resolver.BaseHandlerExceptionResolver:70) - resolve exception message:Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided,request:/dart-backend/file/upload,queryString:null
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:85)
at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:79)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1099)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:932)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.ximalaya.xdcs.spring.filter.XmlyXdcsTraceFilter.doFilter(XmlyXdcsTraceFilter.java:169)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.nali.common.web.CharacterFilter.doFilter(CharacterFilter.java:57)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
at org.apache.catalina.connector.Request.parseParts(Request.java:2826)
at org.apache.catalina.connector.Request.getParts(Request.java:2793)
at org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1084)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:92)
... 38 more
解決方法:在DispatcherServlet裏面添加Multipart-config 配置。寫入loaction和 文件上傳大小限制就能解決上面拋異常的問題了。
<servlet>
<servlet-name>Spring Web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:web-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!--臨時文件的目錄-->
<location>/tmp/upload/</location>
<!-- 上傳文件最大10M -->
<max-file-size>10485760</max-file-size>
<!-- 上傳文件整個請求不超過10M -->
<max-request-size>10485760</max-request-size>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>Spring Web</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
最後說明:
我之前找了很多人的解決方案。都是不正確的。寫這個就是希望大家可以最快的解決問題。不走彎路。在這裏我真的很想吐槽國內的程序員的質量真是太差了。寫博客一個問題都描述不清楚。如果你看到我的博客問題還是不能解決。可以在評論裏面留言。我看到後會給予幫助。希望國內的程序員都能好好寫博客。不然最後大家和世界的差距只會越來越大。