Olá pessoal, estou implementando uma VIEW em que desejo listar imagens armazendas no Banco de Dados em colunas do tipo LONGBLOB, eu consigo recuperar o atribtuto do tipo byte[], faço o objeto DefaultStreamedContent e armazeno em uma lista do mesmo tipo, porém ao tentar utilizar esta llista em um dataGrid ou DataTable a imagem não é renderizada.Já tentei retornar uma imagem através de um Iterator pelo própio Mangaed Bean e deu certo, o problema está na hora de usar em componentes que fazem iteração automática como os que mencionei ou em ui:repeat.Alguém sabe como posso fazer isso?
link:
http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=4163&p=18735&hilit=streamedcontent#p18769
Faz mais de um mês que estou tentando fazer isto, e não consigo , já abri post no prime faces e não tive suport.
Qual componente vc usar pra mostrar a imagem, p:grapicImage?
iiso mesmo estou usando o p:graphicImage setando como valor objetos do tipo DefaultStreamedContent.
tipo
<ui:repeat value=#{mb.fotos} var="item'>
<p:graphicImage value=#{item} />
</ui:repeat>
onde mb.fotos é uma coleção de objetos do tipo requerido pelo primefaces DefaultStreamedContent.
Já faz um bom tempo que estou tentando fazer aparecer está imagem e nada cara, postei la no forum do prime, mais ninguem deu suport
Se vc conseguir me avisa fazendo favor
Encontrei a solução em um fórum do Primefaces
você dve fazer o seguinte:
Crie uma classe auxiliar Image
Esta classe será usada para sequenciar os objetos StreamedContent dentro de uma lista que será usada em seu ManagedBean.
public class Image {
private Integer id;
private StreamedContent image;
public Image(Integer id, StreamedContent image) {
this.id = id;
this.image = image;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public StreamedContent getImage() {
return image;
}
public void setImage(StreamedContent image) {
this.image = image;
}
}
Agora construa seu ManagedBean com base neste.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package mb;
/**
*
* @author gti
*/
import beans.PlayerScreenInfo;
import dao.PlayerScreenInfoDAO;
import util.Image;
import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
@ManagedBean(name = "SBean")
@SessionScoped
public class SBean implements Serializable {
private HashMap<Integer, Image> images = new HashMap<Integer, Image>();
private ImagensDAO dao = new ImagensDAO();
public SBean() {
Iterator<PlayerScreenInfo> it = dao.listAll().iterator();
int id = 1;
while (it.hasNext()) {
Imagem info = it.next();
byte[] data = info.getByte();
images.put(id, new Image(id, new DefaultStreamedContent(new ByteArrayInputStream(data))));
id++;
}
}
public List<Image> getImageList() {
return new ArrayList<Image>(images.values());
}
public StreamedContent getImage() {
String image_id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("image_id");
System.out.println("image_id: " + image_id);
if (image_id == null) {
return images.get(1).getImage(); //if you return null here then it won't work!!! You have to return something.
}
return images.get(Integer.parseInt(image_id)).getImage();
}
}
Por fim, crie uma view no seguinte estilo
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Index</title>
</h:head>
<h:body>
<h:form>
<ui:repeat value="#{SBean.imageList}" var="image">
<p:panel header="#{image.id}">
<p:graphicImage value="#{SBean.image}" height="100" width="100">
<f:param name="image_id" value="#{image.id}"/>
</p:graphicImage>
</p:panel>
</ui:repeat>
</h:form>
</h:body>
</html>
É isso aí, qualquer dúvida veja o fórum do primefaces com a solução:
http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=4163&p=18735&hilit=streamedcontent#p18769
é tambem encontrei está solução
porem só funciona com sessionScoped
gostaria de fazer funcionar com viewScoped
mais valew
Este meu chegou a funcionar com RequestScoped, tente o VIewScoped, pode ser que funcione.
então é com viewScoped mesmo que eu queria rsrs não funciona, o meu funcionou apenas com applicationScoped e sessionScoped
Chegou em alguma solução? Estou com o mesmo problema, e ja verifico em alguns foruns que você vem procurando essa solução a um tempo, hehe!