天天看點

Spring boot處理附件的一個坑

最近在做項目的時候由以前的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