使用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。

推薦閱讀: