国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Spring Boot應用上傳文件時報錯的原因及解決方案

瀏覽:2日期:2023-07-23 17:20:49
問題描述

Spring Boot應用(使用默認的嵌入式Tomcat)在上傳文件時,偶爾會出現上傳失敗的情況,后臺報錯日志信息如下:“The temporary upload location is not valid”。

原因追蹤

這個問題的根本原因是Tomcat的文件上傳機制引起的!Tomcat在處理文件上傳時,會將客戶端上傳的文件寫入臨時目錄,這個臨時目錄默認在/tmp路徑下,如:“/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT”。而操作系統對于/tmp目錄會不定時進行清理,如果正好因為操作系統的清理導致對應的臨時目錄被刪除,客戶端再上傳文件時就會報錯:“The temporary upload location is not valid”。實際上,追蹤一下源碼會發現,如果不明確設置Tomcat的文件上傳臨時目錄,默認讀取的是Servlet上下文對象的屬性“javax.servlet.context.tempdir”值,如下源碼:

org.apache.catalina.connector.Request

private void parseParts(boolean explicit) { //... MultipartConfigElement mce = this.getWrapper().getMultipartConfigElement(); //... // 讀取MultipartConfigElement對象的location屬性 String locationStr = mce.getLocation(); File location; if (locationStr != null && locationStr.length() != 0) { location = new File(locationStr); if (!location.isAbsolute()) { location = (new File((File)context.getServletContext().getAttribute('javax.servlet.context.tempdir'), locationStr)).getAbsoluteFile(); } } else { // 如果location屬性值為空,則讀取Servlet上下文對象的屬性“javax.servlet.context.tempdir”值(如:/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT) location = (File)context.getServletContext().getAttribute('javax.servlet.context.tempdir'); } //...}解決辦法

既然是因為上傳文件的臨時路徑被刪除導致的問題,就要確保改臨時目錄不會被刪除。2種解決方法:(1)通過Spring Boot的配置參數“spring.servlet.multipart.location”明確指定上傳文件的臨時目錄,確保該路徑已經存在,而且該目錄不會被操作系統清除。

spring.servlet.multipart.location=/data/tmp

如上所示,將上傳文件的臨時目錄指定到路徑“/data/tmp”下。

實際上,在Spring Boot中關于上傳文件的所有配置參數如下所示:

# MULTIPART (MultipartProperties)spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.spring.servlet.multipart.location= # Intermediate location of uploaded files.spring.servlet.multipart.max-file-size=1MB # Max file size.spring.servlet.multipart.max-request-size=10MB # Max request size.spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.

(2)在Spring容器中明確注冊MultipartConfigElement對象,通過MultipartConfigFactory指定一個路徑。在上述源碼追蹤中就發現,Tomcat會使用MultipartConfigElement對象的location屬性作為上傳文件的臨時目錄。

/** * 配置上傳文件臨時目錄 * @return */@Beanpublic MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); // tmp.dir參數在啟動腳本中設置 String path = System.getProperty('tmp.dir'); if(path == null || ''.equals(path.trim())) { path = System.getProperty('user.dir'); } String location = path + '/tmp'; File tmpFile = new File(location); // 如果臨時目錄不存在則創建 if (!tmpFile.exists()) { tmpFile.mkdirs(); } // 明確指定上傳文件的臨時目錄 factory.setLocation(location); return factory.createMultipartConfig();}參考

https://stackoverflow.com/questions/50523407/the-temporary-upload-location-tmp-tomcat-4296537502689403143-5000-work-tomcat/50523578

以上就是Spring Boot應用上傳文件時報錯的原因及解決方案的詳細內容,更多關于Spring Boot應用上傳文件時報錯的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产精品视频网址 | 久久国产精品久久 | 亚洲国产精品久久日 | 五月激情丁香婷婷综合第九 | 成人小视频在线观看免费 | 欧美性毛片大片 | 尹人香蕉久久99天天拍 | 免费一级大毛片a一观看不卡 | 亚洲成人自拍网 | 亚洲人成免费 | 在线精品国内外视频 | 嫩草一区二区三区四区乱码 | 精品久久久久久中文字幕网 | 日本www高清免费视频观看 | 成人做爰视频www | 成人做爰视频www网站 | 国产一精品一aⅴ一免费 | 怡红院免费全部视频在线视频 | 国内精品一区二区在线观看 | 三级黄色在线播放 | 成 人色 网 站 欧美大片在线观看 | 亚洲成人7777| 国产综合精品久久久久成人影 | 日韩一区二区天海翼 | 最刺激黄a大片免费网站 | 一级毛片牲交大片 | 亚州免费视频 | 自拍偷自拍亚洲精品10p | 不卡一区二区在线 | 手机看片自拍自自拍日韩免费 | 国产自愉自愉全免费高清 | 亚洲人成综合网站在线 | 久久亚洲私人国产精品va | 精品九九久久国内精品 | 日韩视频在线观看 | 国产一区二区三区精品久久呦 | 播放一级毛片 | 成人毛片在线播放 | 亚洲国产日韩在线 | 欧美 亚洲 另类 自拍 在线 | 欧美一级淫片免费播放口 |