This question already has answers here:
Display dynamic image from database or remote source with p:graphicImage and StreamedContent
(4个答案)
4年前关闭。
我想使用PrimeFaces数据表从数据库动态加载图像。基于this PF forum topic的代码如下所示:
与
但是我不能使它工作。我的参数将“ null”传递给我的支持bean。这是怎么引起的,我该如何解决?
我正在使用Netbeans 6.9.1,JSF 2.0和Primefaces 2.2.RC2。
我继续使用BalusC第一个解决方案,它运行良好,但没有在UI中渲染图像。例外Glassfish正在抛出:
好吧,由于BalusC,我似乎可以上班了。我已经使用RequestScoped,SessionScoped或ApplicationScoped来管理getStreamedImageId。但是,在UI中始终设置默认图像(对于空情况),而不是按预期设置与每一行对应的图像。新的代码是:
(4个答案)
4年前关闭。
我想使用PrimeFaces数据表从数据库动态加载图像。基于this PF forum topic的代码如下所示:
<p:dataTable id="tablaInventario" var="inv" value="#{registrarPedidoController.inventarioList}" paginator="true" rows="10"
selection="#{registrarPedidoController.inventarioSelected}" selectionMode="single"
update="tablaInventario tablaDetalle total totalDesc" dblClickSelect="false" paginatorPosition="bottom">
<p:column sortBy="producto.codigo" filterBy="producto.codigo">
<f:facet name="header">#{msg.codigo}</f:facet>
#{inv.producto.codProducto}
</p:column>
<p:column>
<f:facet name="header">Foto</f:facet>
<p:graphicImage id="photo" value="#{registrarPedidoController.streamedImageById}" cache="FALSE">
<f:param name="inv" value="#{inv.id}" />
</p:graphicImage>
</p:column>
</p:dataTable>
与
public StreamedContent getStreamedImageById() {
DefaultStreamedContent image = null;
String get = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("inv");
System.out.println("[Param]: " + get); // This prints null.
Long id = new Long(get);
List<Inventario> listInventarios = controladorRegistrarPedido.listInventarios();
for (Inventario i : listInventarios) {
if (i.getId().compareTo(id) == 0) {
byte[] foto = i.getProducto().getFoto();
image = new DefaultStreamedContent(new ByteArrayInputStream(foto), "image/png");
}
}
return image;
}
但是我不能使它工作。我的参数将“ null”传递给我的支持bean。这是怎么引起的,我该如何解决?
我正在使用Netbeans 6.9.1,JSF 2.0和Primefaces 2.2.RC2。
我继续使用BalusC第一个解决方案,它运行良好,但没有在UI中渲染图像。例外Glassfish正在抛出:
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at com.sun.faces.mgbean.BeanManager$ScopeManager$ViewScopeHandler.isInScope(BeanManager.java:552)
好吧,由于BalusC,我似乎可以上班了。我已经使用RequestScoped,SessionScoped或ApplicationScoped来管理getStreamedImageId。但是,在UI中始终设置默认图像(对于空情况),而不是按预期设置与每一行对应的图像。新的代码是:
public StreamedContent streamedById(Long id) {
DefaultStreamedContent image = null;
System.out.println("[ID inventario]: " + id);
List<Inventario> listInventarios = controladorRegistrarPedido.listInventarios();
for (Inventario i : listInventarios) {
if (i.getId().equals(id)) {
byte[] foto = i.getProducto().getFoto();
if (foto != null) {
System.out.println(" [Foto]: " + foto);
image = new DefaultStreamedContent(new ByteArrayInputStream(foto), "image/png");
break;
}
}
}
if (image == null) {
System.out.println(" [Image null]");
byte[] foto = listInventarios.get(0).getProducto().getFoto();
image = new DefaultStreamedContent(new ByteArrayInputStream(foto), "image/png");
}
System.out.println(" [Foto Streamed]: " + image);
return image;
}
最佳答案
<p:graphicImage>
将两次调用getter方法。第一次是将<img>
元素呈现为HTML,因此需要src
属性中的URL。如果仅返回new DefaultStreamedContent()
,则它将在src
属性中自动生成正确的URL。第二次是浏览器真正请求图像时,这是您应该返回实际图像的时刻。
因此,getter方法基本上应如下所示:
public StreamedContent getStreamedImageById() {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
// So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
return new DefaultStreamedContent();
}
else {
// So, browser is requesting the image. Get ID value from actual request param.
String id = context.getExternalContext().getRequestParameterMap().get("id");
Image image = service.find(Long.valueOf(id));
return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes()));
}
}