前一段時間遇到一個問題,是關于讀取項目中文件資源的問題。我是一個maven工程 我把一張照片放到resource下面,然后在本地讀取的時候可以讀取到,但是一旦打成war包以后就總是包找不到文件資源錯誤。我的war包是springboot打的war包,是內嵌的tomcat所以不解壓,然后系統去找路徑的時候會發現是個war包,而圖片在war包內,所以找不到。
為了解決這個問題,我走了好多彎路,一直在路徑上花費時間。
一開始使用修改配置文件的方式:
1
2
3
4
|
# 配置靜態資源訪問前綴 spring.mvc. static -path-pattern=*/** # 配置靜態資源路徑,默認配置失效 spring.resources. static -locations=../upload |
發現并不行,無法解析出相對路徑。
最后我是通過系統運行去讀取文件源,然后將文件流存儲在服務器上,存一個臨時文件,然后系統再去讀這個臨時文件,然后就讀取到這個文件了。
其實就是java數據流轉換為文件
解題思路是上述那樣的。接著就是代碼了
調用代碼如下
1
2
3
4
5
6
|
file f = new file( "/tmp/image1.jpg" )); //臨時圖片存在的位置 if (!f.exists()) { inputstream in = this .getclass().getresourceasstream( "/templates/emailimg.png" ); //圖片在項目中的位置 fileutil.inputstreamtofile(in, f); } // 如果需要使用文件,這個/tmp/image1.jpg就是臨時文件路徑 |
轉換方法代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static void inputstreamtofile(inputstream ins, file file) { try { outputstream os = new fileoutputstream(file); int bytesread = 0 ; byte [] buffer = new byte [ 8192 ]; while ((bytesread = ins.read(buffer, 0 , 8192 )) != - 1 ) { os.write(buffer, 0 , bytesread); } os.close(); ins.close(); } catch (exception e) { e.printstacktrace(); } } |
需要注意一下, 放置臨時文件的路徑可能是在docker容器中的,而不是在服務器上. 所以需要先把前面的路徑 mkdirs
, 然后再f.createnewfile;
, 一下再調用fileutil.inputstreamtofile
才可以。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/u012373815/article/details/52916868