今天發現一個問題,在本地的開發環境下可以讀取.pptx檔案。但是部署到測試環境或者開發環境就會報錯,因為此時這個.pptx檔案被打成jar包了。導緻讀取檔案時無法讀取。一旦被打入jar包,path就變為了jar:file:\usr\local\product\jar\product-controller-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\template\service_proposal_template.pptx,進而無法讀取到對應jar中的檔案位址。
通過以下這種方式去擷取工程檔案中的資源位址
URL classPath = Thread.currentThread().getContextClassLoader().getResource("");
//模闆檔案路徑
String proFilePath = classPath.toString();
//移除開通的file:/六個字元
proFilePath = proFilePath.substring(6) + "template/" + ProductContant.SERVICE_PROPOSAL_TEMPLATE_NAME + ".pptx";
File file = new File(proFilePath);
InputStream powerPoint = new FileInputStream(file);
會報如下錯誤:
2017-12-12 12:16:19.181 ERROR com.xxx.product.application.ControllerAdvice 24 errorHandler -- le:/usr/local/product/jar/product-controller-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/template/service_proposal_template.pptx (No such file or directory)
exception='java.io.FileNotFoundException: le:/usr/local/atme-product/jar/atme-product-controller-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/template/service_proposal_template.pptx (No such file or directory)
解決方案:
不讀取工程中的檔案位址,直接将對應檔案轉化為二進制流進行操作。
InputStream is = this.getClass().getClassLoader().getResourceAsStream("template/service_proposal_template.pptx");
InputStream powerPoint = new FileInputStream(is);