午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Boot應(yīng)用上傳文件時(shí)報(bào)錯(cuò)的原因及解決方案

瀏覽:20日期:2023-07-23 17:20:49
問(wèn)題描述

Spring Boot應(yīng)用(使用默認(rèn)的嵌入式Tomcat)在上傳文件時(shí),偶爾會(huì)出現(xiàn)上傳失敗的情況,后臺(tái)報(bào)錯(cuò)日志信息如下:“The temporary upload location is not valid”。

原因追蹤

這個(gè)問(wèn)題的根本原因是Tomcat的文件上傳機(jī)制引起的!Tomcat在處理文件上傳時(shí),會(huì)將客戶端上傳的文件寫入臨時(shí)目錄,這個(gè)臨時(shí)目錄默認(rèn)在/tmp路徑下,如:“/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT”。而操作系統(tǒng)對(duì)于/tmp目錄會(huì)不定時(shí)進(jìn)行清理,如果正好因?yàn)椴僮飨到y(tǒng)的清理導(dǎo)致對(duì)應(yīng)的臨時(shí)目錄被刪除,客戶端再上傳文件時(shí)就會(huì)報(bào)錯(cuò):“The temporary upload location is not valid”。實(shí)際上,追蹤一下源碼會(huì)發(fā)現(xiàn),如果不明確設(shè)置Tomcat的文件上傳臨時(shí)目錄,默認(rèn)讀取的是Servlet上下文對(duì)象的屬性“javax.servlet.context.tempdir”值,如下源碼:

org.apache.catalina.connector.Request

private void parseParts(boolean explicit) { //... MultipartConfigElement mce = this.getWrapper().getMultipartConfigElement(); //... // 讀取MultipartConfigElement對(duì)象的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上下文對(duì)象的屬性“javax.servlet.context.tempdir”值(如:/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT) location = (File)context.getServletContext().getAttribute('javax.servlet.context.tempdir'); } //...}解決辦法

既然是因?yàn)樯蟼魑募呐R時(shí)路徑被刪除導(dǎo)致的問(wèn)題,就要確保改臨時(shí)目錄不會(huì)被刪除。2種解決方法:(1)通過(guò)Spring Boot的配置參數(shù)“spring.servlet.multipart.location”明確指定上傳文件的臨時(shí)目錄,確保該路徑已經(jīng)存在,而且該目錄不會(huì)被操作系統(tǒng)清除。

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

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

實(shí)際上,在Spring Boot中關(guān)于上傳文件的所有配置參數(shù)如下所示:

# 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容器中明確注冊(cè)MultipartConfigElement對(duì)象,通過(guò)MultipartConfigFactory指定一個(gè)路徑。在上述源碼追蹤中就發(fā)現(xiàn),Tomcat會(huì)使用MultipartConfigElement對(duì)象的location屬性作為上傳文件的臨時(shí)目錄。

/** * 配置上傳文件臨時(shí)目錄 * @return */@Beanpublic MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); // tmp.dir參數(shù)在啟動(dòng)腳本中設(shè)置 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); // 如果臨時(shí)目錄不存在則創(chuàng)建 if (!tmpFile.exists()) { tmpFile.mkdirs(); } // 明確指定上傳文件的臨時(shí)目錄 factory.setLocation(location); return factory.createMultipartConfig();}參考

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

以上就是Spring Boot應(yīng)用上傳文件時(shí)報(bào)錯(cuò)的原因及解決方案的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot應(yīng)用上傳文件時(shí)報(bào)錯(cuò)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 久久女人天堂 | 天堂中文在线观看 | 亚洲黄色免费观看 | 超碰96在线 | 黄色大片在线播放 | 三级视频在线看 | 老女人连续高潮呻吟 | 性荡视频 | 国产色区 | 狠狠地操 | 日韩精品无码一区二区三区 | 久久久精品网 | 噜噜噜在线视频 | 香蕉视频最新网址 | 亚洲国内精品 | 国产午夜麻豆影院在线观看 | 亚洲精品久久久久 | 黄色小视频免费看 | 伊人春色影院 | 欧美黄色片视频 | 亚洲午夜在线播放 | 欧洲av在线播放 | 一级片免费在线观看 | 波多野结衣一区二区三区在线观看 | 日韩高清精品免费观看 | 亚洲图片一区 | 国产欧美一区二区三区视频在线观看 | 精品一区二区三区三区 | 久久免费播放视频 | 日韩另类在线 | 国产在线视视频有精品 | 亚洲欧美日本在线 | 亚洲精品免费播放 | 超碰99在线 | 美女特级毛片 | 无限国产资源 | 婷婷亚洲天堂 | 黄色国产视频网站 | 99re国产| 日韩精品一区二区三区在线 | 国产精品www色诱视频 |