SpringBoot 讀取文件代碼模版

引言

Alice上線後,學生導入模版文件下載失敗。java

clipboard.png

未打包是沒問題的,打完包後就發生了錯誤。開始逐步定位問題。spring

原方法

File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx");
InputStream inputStream = new FileInputStream(file);
Workbook workbook = new XSSFWorkbook(inputStream);

經測試,問題出在ResourceUtils.getFile這個方法上。app

ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx"

字符串拼接後就是classpath:static/導入學生模板.xlsx,沒打包時,該方法能正常獲取到該Excel文件。spring-boot

ResourceUtils.getFile是獲取磁盤上的文件,而打完包以後,resources目錄了下的全部資源都被打進了jar包,因此不存在相應的Excel文件,獲取的時候就報錯了。找不到文件。測試

測試

將打好的jar包解壓,主要的東西都在BOOT-INF裏。META-INF裏面有pom.xml,應該是存儲項目信息的。org目錄內是springframework的一些class字節碼。this

clipboard.png

BOOT-INF內就是本項目的核心代碼與第三方庫。spa

clipboard.png

classes目錄下就是本項目的核心代碼,咱們的Excel就在這裏面。code

clipboard.png

lib目錄下是項目中引用的第三方jar包,裏面有咱們經常使用的slf4jspring-bootjar包。xml

clipboard.png

因此,Spring Boot的項目通常都較大,有一部分緣由是把許多第三方包都打包進去了。對象

clipboard.png

解決方案

@Autowired一個ResourceLoader,而後調用getResource方法,加載資源。

想一想也不難理解,SpringBoot啓動時讀取application.yml配置,Spring的源碼中就是使用ResourceLoader實現的。

只不過源碼中直接用的上下文對象,一個上下文對象不僅是一個IOC容器,仍是一個資源加載器。(上下文其實有不少的功能,能夠點開Spring源碼看一看,頗有意思。)

ResourcePatternResolver派生自ResourceLoader接口。

clipboard.png

clipboard.png

代碼模版,之後讀取文件就這樣寫,啥毛病沒有:

Resource resource = this.resourceLoader.getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx");

總結

千淘萬漉雖辛苦,吹盡狂沙始到金。
——劉禹錫《浪淘沙詞九首·其九》

一路走來,一路總結。最後留下的,是小本本中記錄的代碼模版與最佳實踐。

clipboard.png

相關文章
相關標籤/搜索