Нужно отобразить изображения находящиеся в BLOB-ах графическим компонентом PrimeFaces <p:galleria>.
Вот реализация на данный момент -
| Код | <p:dataGrid var="car" value="#{postController.cars}" columns="3" rows="12" <!-- Получаем список cars --> paginator="true" rowsPerPageTemplate="9,12,15" currentPageReportTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"> <p:column> <p:panel header="#{car.autoMark}"> <h:panelGrid columns="1"> <h:outputText value="#{car.autoModel}" /> <p:galleria value="#{imageController.getImagesById(car.id)}" var="image" panelWidth="152" panelHeight="102" showCaption="false"> <!-- Получаем список изображений для конкретной car --> <p:graphicImage value="/TestImage?imageInBytes=#{image.imageInBytes}" alt="Image Description for #{image.id}" title="#{image.lot_id}" /> <!-- Преобразуем байты в изображения сервлетом --> </p:galleria> </h:panelGrid> </p:panel> </p:column> </p:dataGrid>
|
Строка
| Код | <p:graphicImage value="/TestImage?imageInBytes=#{image.imageInBytes}" alt="Image Description for #{image.id}" title="#{image.lot_id}" />
|
в браузере
| Код | <img id="j_idt19:1:j_idt27" src="/PROJECT/TestImage?imageInBytes=[B@2f0aadeb&pfdrid_c=true" alt="Image Description for 1" title="1">
|
Сейчас 2 проблемы:
1. Не отображаются изображения. Код сервлета - не знаю что тут не так.
| Код | response.setContentType("image/jpeg"); try (OutputStream out = response.getOutputStream();) { byte[] imageInBytes = request.getParameter("imageInBytes").getBytes(); response.setContentLength(imageInBytes.length); out.write(imageInBytes); } catch (Exception ex) { ex.printStackTrace(); } }
|
2. Компоненту <p:galleria> передается несколько объектов-изображений, но определяется только одно, при этом в следующем блоке dataGrid в котором свой компонент <p:galleria> со своими изображениями отображается второе изображение из первого компонента <p:galleria>, имхо не отрабатывает внутренний цикл, как исправить эту асинхронность? |