【解決】spring boot項(xiàng)目在Linux系統(tǒng)中,上傳文件提示 is not valid解決方案
今天突然收到錯(cuò)誤反饋文件上傳失敗了。錯(cuò)誤如下圖:

Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.2108414996593143912.8080/work/Tomcat/localhost/ROOT] is not valid
這個(gè)問題之前沒遇到過啊。然后BXX后,網(wǎng)上還真有人遇到。原因分析:
原因:在linux系統(tǒng)中,springboot應(yīng)用服務(wù)再啟動(java -jar 命令啟動服務(wù))的時(shí)候,會在操作系統(tǒng)的/tmp目錄下生成一個(gè)tomcat*的文件目錄,上傳的文件先要轉(zhuǎn)換成臨時(shí)文件保存在這個(gè)文件夾下面。由于臨時(shí)/tmp目錄下的文件,在長時(shí)間(10天)沒有使用的情況下,就會被系統(tǒng)機(jī)制自動刪除掉。所以如果系統(tǒng)長時(shí)間無人問津的話,就可能導(dǎo)致上面這個(gè)問題。
是因?yàn)長inux自己處理的原因。
感謝:https://blog.csdn.net/weixin_42399503/article/details/94009802
解決方案一,修改Liunx配置:

這個(gè)方案,是需要修改系統(tǒng)配置。算了,還是放棄吧。萬一修改錯(cuò)誤,引發(fā)其他血案就不好玩了。
解決方案二:
萬能的重啟大法。重啟自己的服務(wù)。雖然能臨時(shí)解決,但是不能從根本上解決啊。
所以,這個(gè)方案,放棄。
解決方案三:
1.如果不是很重要的接口,請求方式可以換成get,就不會出現(xiàn)錯(cuò)誤
2.post請求,用json傳參(application/json)也行,不是multipart/form-data就行
3.在配置文件中加入這個(gè) server.tomcat.basedir=/XXX/XXX/XXX(自定義目錄-網(wǎng)上看到的,驗(yàn)證了下啟動時(shí)會自動創(chuàng)建該目錄/XXX/XXX/XXX/work/Tomcat/localhost/ROOT)
比如凱哥的:

以下是我跟蹤的過程,除了以上解決方式你也可以自己考慮考慮看看
開發(fā)環(huán)境復(fù)現(xiàn)跟蹤
咱可以在開發(fā)環(huán)境下debug跟蹤問題原因呀,首先我想到的是在DispatcherServlet 的doService(…)方法下看看request.getParts()的路徑發(fā)現(xiàn)是C:\Users\user\AppData\Local\Temp\tomcat.4632713886902697899.8080\work\Tomcat\localhost\ROOT,然后把目錄刪掉,再進(jìn)doService(…)方法看,結(jié)果發(fā)現(xiàn)已經(jīng)拋出異常了,那這個(gè)好說,一層層往上找,最后在ApplicationFilterChain(應(yīng)用攔截鏈)的internalDoFilter(內(nèi)部過濾器)方法中,當(dāng)執(zhí)行完過濾器HiddenHttpMethodFilter(隱藏Http請求方法過濾器)時(shí),發(fā)現(xiàn)又報(bào)錯(cuò)了,那咱就鎖定HiddenHttpMethodFilter了,首先發(fā)現(xiàn)請求必須為post方式并且沒有異常才會發(fā)生上面那錯(cuò),

然后一步步跟下去,又發(fā)現(xiàn)請求的contentType值必須為multipart/form-data才會進(jìn)入記錄異常代碼中,

那咱再繼續(xù)往下看,就可以看到獲取目錄的地方,它將臨時(shí)目錄強(qiáng)轉(zhuǎn)為文件,并且判斷這個(gè)文件是否為一個(gè)目錄,如果不是,就會捕獲上面的異常,在后續(xù)拋出。

