1. 程式人生 > >Spring boot檔案上傳報錯: The temporary upload location is not valid

Spring boot檔案上傳報錯: The temporary upload location is not valid

最近在做Excel匯入時,一次偶然的測試發現bug報錯如下:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [C:\Users\AppData\Local\Temp\tomcat.4266029690466887869.8037\work\Tomcat\localhost\ROOT] is not valid
	at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:112)
	at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:86)
	at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:79)
	at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1104)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:936)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	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)

產生問題的原因在於Spring boot專案在啟動後,系統會自動在Temp目錄下為其建立若干個目錄作為臨時資料夾。我對每份待解析的Excel檔案都是用了Paths.get(url),此方法會將檔案下載至系統的臨時資料夾中。

很遺憾,這個臨時儲存路徑已經不存在了

為什麼會被清除,暫不清楚。

解決辦法:

@Configuration
public class MultipartConfig {

    @Bean
    MultipartConfigElement multipartConfigElement(){
        MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory();
        String location = FileConstant.tempSavePath2;
        File tempFile = Paths.get(location).toFile();
        if(!tempFile.exists()){
            tempFile.mkdirs();// mkdirs能建立多級目錄
        }
        multipartConfigFactory.setLocation(location);
        return multipartConfigFactory.createMultipartConfig();
    }
}