最近在做項目的時候由以前的war包部署在tomcat中運作,改成了Spring boot架構,Spring boot架構更加簡單友善的搭建一個web應用。
之前的代碼在改造的過程中遇到了一個關于附件處理的坑,之前在war包運作的時候,使用了Spring提供的ResourceLoader擷取附件,代碼是這樣寫的:
@Autowired
private ResourceLoader resourceLoader;
protected File getExportFile(MultivaluedMap<String, String> mm)
throws IOException {
return resourceLoader.getResource("classpath:tpl/DemoTpl.docx").getFile();
}
使用Spring boot了之後代碼代碼在Eclipse中直接運作是可以正常使用的,但是當打包成jar包,放到docker上運作的時候就出問題了,提示擷取不到file,這個就坑了,後來通過eclipse遠端調試,找到了問題的原因,關于怎麼在eclipse中遠端調試,可以檢視我的另一篇部落格:
Eclipse遠端調試
代碼打包成jar包後,目錄結構發生變化了之前的tpl放在了BOOT-INF這個下面,但是路徑裡面多了一個!号導緻取不到檔案,後來才發現jar包裡面是沒有File實體的,因為File必須要放到一個磁盤目錄下面。找到原因後就改成直接去Io流Stream了,而且用IO流的好處要比File好處更多,優化後的代碼為:
protected InputStream getExportTplInputStream(MultivaluedMap<String, String> mm)
throws IOException {
return resourceLoader.getResource("classpath:tpl/DemoTpl.docx").getInputStream();
}
在有檔案處理的地方,更加推崇用Io流的方式取代直接操作File