springboot如何獲取文件流
springboot獲取文件流
在日常開發(fā)中,經(jīng)常會獲取項目的相對路徑用以獲取存放在項目路徑下的資源,如獲取static/ss.txt
在spring項目中, 可以用request.getRealPath("/")獲取項目路徑然后拼接起來,再生成流:
//拼接地址 String downLoadUrl = request.getRealPath("/") + "/static/ss.txt/" ; // 生成流 InputStream is = new FileInputStream(downLoadUrl);
在springBoot中,request.getRealPath("/") 不能獲取到項目路徑,查資料得知ResourceUtils.getURL("classpath:").getPath()能獲取到項目路徑,測試中發(fā)現(xiàn),ResourceUtils.getURL("classpath:").getPath()獲取到的是項目的絕對路徑,打包發(fā)版提示:
java.io.FileNotFoundException: file:/usr/local/risk_dubbo/risk-admin/20181105_161334risk-admin.war!/WEB-INF/classes!/static/ss.txt (No such file or directory)
不能用以獲取項目中的資源路徑。各種查資料測試得出:
String downLoadUrl = "/static/ss.txt" ; InputStream is = this.getClass().getResourceAsStream(downLoadUrl);
可獲取輸入流。
前端獲取springboot返回的文件流的踩坑
通過訪問后臺返回文件流的方式我想大家都會,這次就不展開講了。主要想說的是向后臺傳遞文件路徑時的一些小思考!
前提是訪問圖片流的方式用的是restful + 動態(tài)路徑填充的方式,eg: locahost:8080/test/img/1.png
如果你獲取的文件路徑只是文件名的話(就像我上面舉的例子),文件路徑就可以安全的傳遞到后臺,完全沒有問題。
但是假如你現(xiàn)在的文件路徑為:shop/goods/title/1.png ,你應(yīng)該怎么進(jìn)行傳遞?
這樣嗎 -> eg: locahost:8080/test/img/shop/goods/title/1.png 仔細(xì)的人會發(fā)現(xiàn)這樣是行不通的,因為瀏覽器會去匹配后臺的url為: img/shop/goods/title/,對應(yīng)的動態(tài)的參數(shù)為1.png; 這并不是我們想要的結(jié)果,我們想把 shop/goods/title/1.png 作為參數(shù)傳遞到后臺,結(jié)果為報404!
那么應(yīng)該怎么處理呢?聰明的同學(xué)會想到替換(replace),將 / 替換為 '-' 或者其他的操作符
假如說替換成 '-' 的話,那么應(yīng)該怎么替換呢?后臺接收時又應(yīng)該怎么進(jìn)行恢復(fù)原來的文件路徑呢?
如果你選擇在前臺 replaceAll ,后臺再進(jìn)行轉(zhuǎn)義回來,如果你的文件名上傳到服務(wù)器不打算保存,直接存儲一串?dāng)?shù)字的話應(yīng)該是沒有問題的!
假如現(xiàn)在路徑參數(shù)變?yōu)? shop/goods/title/2019-04-12.png,那后臺恢復(fù)文件路徑的時候就變成了: shop/goods/title/2019/04/12.png ,你可能會驚訝,what?啥情況
踩過坑的我給您提供一個答案
仔細(xì)觀察windows的文件命名會發(fā)現(xiàn) 一些禁用的字符 < > / \ | : " * ?,你會發(fā)現(xiàn) / 也在其中包括,所以呢,所以呢,文件命名不可能出現(xiàn) /
兩種解決方案
A方案:在你確定當(dāng)前目錄的個數(shù)的情況下進(jìn)行處理,可以寫一個while循環(huán),假如當(dāng)前目錄有3個,while(n<=3){ path = path.repalceFirst('-','/') },前提是目錄不帶 '-' 的情況下
B方案:在前端傳遞時,記錄路徑每個 '/' 的位置,然后將位置拼接到文件名最后然后傳遞到后臺,這樣即可完成精確的恢復(fù)文件路徑。
說到這里,前面忘了一點:就是直接訪問1.png時,為了進(jìn)行路徑的精確匹配,可以在后臺路徑映射時添加此配置: {file:.+}
說了這么多,如果你們項目中上傳文件不需要保留文件名,文件名全靠自定義的話,也就不可能有這么多的事了
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+nginx+https+linux實現(xiàn)負(fù)載均衡加域名訪問簡單測試
這篇文章主要介紹了springboot+nginx+https+linux實現(xiàn)負(fù)載均衡加域名訪問簡單測試,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-05-05使用Jenkins來構(gòu)建SVN+Maven項目的實現(xiàn)
這篇文章主要介紹了使用Jenkins來構(gòu)建SVN+Maven項目的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09java對象類型轉(zhuǎn)換和多態(tài)性(實例講解)
下面小編就為大家?guī)硪黄猨ava對象類型轉(zhuǎn)換和多態(tài)性(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10