SpringMVC 上傳文件遇到的問題和解決方法

背景:

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>

最後說明:

我之前找了很多人的解決方案。都是不正確的。寫這個就是希望大家可以最快的解決問題。不走彎路。在這裏我真的很想吐槽國內的程序員的質量真是太差了。寫博客一個問題都描述不清楚。如果你看到我的博客問題還是不能解決。可以在評論裏面留言。我看到後會給予幫助。希望國內的程序員都能好好寫博客。不然最後大家和世界的差距只會越來越大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章