簡體   English   中英

如何在java jar中正確引用圖像文件?

[英]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")

https://www.baeldung.com/reading-file-in-java

使用此處提供的建議,我能夠打開圖像文件的輸入流,將該輸入流的內容放入 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM