gpt4 book ai didi

image - 如何使用 p :graphicImage with StreamedContent within p:dataTable?

转载 作者:行者123 更新时间:2023-12-03 12:36:09 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Display dynamic image from database or remote source with p:graphicImage and StreamedContent

(4 个回答)


6年前关闭。




我想从带有 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 中总是设置默认图像(对于 null 情况),而不是与每一行对应的图像。新代码是:
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()));
}
}

关于image - 如何使用 p :graphicImage with StreamedContent within p:dataTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8304967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com