使用SpringBoot獲取resources文件路徑
獲取resources文件路徑
背景
在SpringBoot項目中,需要獲取resources文件的路徑,網上找瞭好多文章都不行,後面還是結合官方文檔實現瞭,這裡記錄下,我使用的版本是SpringBoot2.x版本
解決方案
1、獲取resources文件夾路徑
File directory = new File("xxx/xxx/src/main/resources"); String reportPath = directory.getCanonicalPath();
xxx為你的項目內包的名稱,File隻會找到項目最外層地址;
這裡需要註意,不能在xxx前面加/,否則隻會找到頂層地址
獲取resource下文件夾路徑的坑
現在有個需求是需要利用模板文件生成HTML 或者 PDF 文件,然後由於HTML 模板文件裡面包含圖片和字體,然後我就在resource 文件夾下新建瞭一個文件夾,然後又分類,也就是 resource 下面有個 upload文件夾,有個 templateFile 文件夾,然後才是模板文件。也就是說模板文件在resource下面兩級目錄裡面,那麼問題來瞭。用瞭各種辦法,就是獲取不到這個文件。。。。。。。。
前提是maven項目的pom文件裡面配置瞭
maven打包包含這些模板文件:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.png</include> <include>**/*.html</include> <include>**/*.ttf</include> <include>**/*.TTF</include> <include>**/*.ttc</include> </includes> <!--是否替換資源中的屬性--> <filtering>false</filtering> </resource> </resources> </build>
然後install後,可以在當前模塊或者項目的 target 文件夾下可以看到我們的模板文件。
這是後來我修改後的正常打包情況
其中代碼裡面,用瞭好評率最高的這個 ClassPathResource
import org.springframework.core.io; Resource resource = new ClassPathResource("upload/templateFile"); log.info("contextPath:{}", resource.getURL());
這時候,按照理想情況,應該就是可以打印出來 templateFile 這個文件夾所在的絕對路徑瞭。如果這個文件夾存在resource下面,是可以拿到這個文件夾的絕對路徑的。
事實確是空的。。。。。就很神奇,剛開始以為。是不是因為跟別人的項目不一樣,才導致的這個問題呢。
後面踩坑瞭半天,發現,是不是路徑太深瞭,把往前提一層呢,就試下把 templateFile 直接放到 resources 下面,再次嘗試,發現上面日志不再是空的瞭,可以正常取到模板文件所在的絕對路徑瞭。這點windows和Linux都是可以的。
然後看似問題解決瞭,但是由於我這邊部署使用docker鏡像部署的,獲取模板文件和生成文件也是正常的,但是由於生成的HTML文件用到瞭各種logo圖片文件,然後生成的文件所在位置也掛載到宿主機上瞭,在容器內部查看生成的文件是正常的,但是到瞭宿主機上,生成的HTML文件裡面的圖片就不顯示瞭。
期間嘗試瞭使用文件服務器上的圖片,是可以正常顯示的,但是由於文件服務器跟外網不通,所以生成的文件,放到別的地方,圖片就不顯示瞭。
最後還是采用最笨的方法,將容器內部的某個路徑掛載到宿主機的同名路徑上,在宿主機的文件夾下存放固定的模板文件和需要用到的圖片,路徑硬編碼寫死到程序裡面,也是可以正常生成文件和回顯的。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決Maven項目加載spring bean的配置xml文件會提示找不到問題
- 在IDEA中集成maven詳細流程圖示例
- Springboot打包成jar發佈的操作方法
- springboot 2.0 mybatis mapper-locations掃描多個路徑的實現
- 使用Maven打包時包含資源文件和源碼到jar的方法