[英]How to properly reference image file in java jar?
使用 java 1.8,我正在使用 Spring Boot jar 文件,在其中我使用 xlsx4j 包將圖像文件包含到 Excel 文件中。 我已經讓代碼在我的 IDE 中將圖像文件添加到本地的 Excel 文件中,問題是在我將代碼編譯成 jar 文件並將其部署到服務器后它不起作用。 我收到以下錯誤消息:
java.io.FileNotFoundException: File 'file:/opt/app/lib/myjar.jar!/BOOT-INF/classes!/myimage.jpg' does not exist
圖像文件存在於項目的 src/main/resources 文件夾中,這里是我獲取此文件路徑並將其傳遞給將文件附加到 Excel 文件的代碼的代碼:
URL imageUrl = Resources.getResource("myimage.jpg");
SpreadsheetMLPackage pkg = SpreadsheetMLPackage.createPackage();
WorksheetPart workSheetPart = pkg.createWorksheetPart(new PartName("/xl/worksheets/sheet1.xml"), "Quote", 1);
Worksheet worksheet = workSheetPart.getContents();
Drawing drawingPart = new Drawing();
Relationship drawingRel = workSheetPart.addTargetPart(drawingPart);
org.xlsx4j.sml.CTDrawing drawing = org.xlsx4j.jaxb.Context.getsmlObjectFactory().createCTDrawing();
workSheetPart.getJaxbElement().setDrawing(drawing);
drawing.setId( drawingRel.getId() );
BinaryPartAbstractImage imagePart
= BinaryPartAbstractImage.createImagePart(pkg, drawingPart,
FileUtils.readFileToByteArray(new File(imageUrl.getPath()) )); // Using path to image file here
String imageRelID = imagePart.getSourceRelationship().getId();
drawingPart.setJaxbElement(
genericExcelUtil.buildDrawingPartContentUsingCode(imageRelID));
這是我在服務器上獲得的堆棧跟蹤:
java.io.FileNotFoundException: File 'file:/opt/app/lib/myapp.jar!/BOOT-INF/classes!/myimage.jpg' does not exist
at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:292)
at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:1815)
at com.myco.myapp.util.excel.FileImpl.generateExcel(FileImpl.java:113)
at com.myco.myapp.service.impl.EmailServiceImpl.sendEmailService(EmailingServiceImpl.java:61)
at com.myco.myapp.controller.MyController.sendEmailWithDoc(MyController.java:374)
在執行 imageUrl.getPath() 的 System.out.println 時,這就是我的 IDE 中的樣子:
/C:/Users/userid/Documents/workspace-sts-3.9.3.RELEASE/myapp/target/classes/myimage.jpg
這是在服務器上運行時的樣子:
file:/opt/app/lib/myapp.jar!/BOOT-INF/classes!/myimage.jpg
似乎“new File(imageUrl.getPath())”失敗了,因為從服務器運行時它找不到該文件。 關於我如何處理這個的任何想法?
你必須通過類路徑加載它
getClass().getResourceAsStream("/path/in/jar")
使用此處提供的建議,我能夠打開圖像文件的輸入流,將該輸入流的內容放入 ByteArrayOutputStream,將 ByteArrayOutputStream 轉換為字節數組,然后將字節數組提供給 docx4j 方法:
URL imageUrl = Resources.getResource("myimage.jpg");
InputStream imageInputStream = imageUrl.openStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = imageInputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] byteArray = buffer.toByteArray();
BinaryPartAbstractImage imagePart
= BinaryPartAbstractImage.createImagePart(pkg, drawingPart, byteArray);
String imageRelID = imagePart.getSourceRelationship().getId();
drawingPart.setJaxbElement(
genericExcelUtil.buildDrawingPartContentUsingCode(imageRelID));
謝謝您的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.