Как правильно ссылаться на файл изображения в java банку? - PullRequest
0 голосов
/ 07 января 2020

Используя java 1.8, я работаю с jar-файлом Spring Boot, в котором я включаю файл изображения в файл Excel с помощью пакета xlsx4j. У меня есть код, работающий для локального добавления файла изображения в файл Excel в моей IDE, проблема в том, что он не работает после того, как я скомпилировал код в файл 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)

При выполнении System.out. println для imageUrl.getPath (), вот как это выглядит в моей 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

Кажется что «новый файл (imageUrl.getPath ())» терпит неудачу, потому что при запуске с сервера он не может найти файл. Любые идеи о том, как я могу справиться с этим?

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вы должны загрузить его через classpath

getClass().getResourceAsStream("/path/in/jar")

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

0 голосов
/ 08 января 2020

Используя приведенные здесь предложения, я смог открыть входной поток для файла изображения, поместить содержимое этого входного потока в 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));

Спасибо за помощь!

...