a4j:mediaOutput -> Como eu uso ele para exibir uma imagem do disco/bd?

9 respostas
P

Pessoal, estou com dificuldades para entender o exemplo da página :

http://livedemo.exadel.com/richfaces-demo/richfaces/mediaOutput.jsf?tab=usage&cid=267499

Como eu posso adaptar esse exemplo para o meu uso, onde pretendo fazer o upload de um arquivo com o rich:fileUpload e após isso, renderizar a imagem no mediaOutput. Esse seria o caso da imagem vinda do disco.

Em outro caso, eu quero pegar a imagem do banco, salva em byte[] (BLOB) e fazer a conversão. A principio estou com dificuldades principalmente na classe MediaBean(em construir o método paint e os argumentos do método…) e a classe MediaData.

No caso, como deveria ser o meu método void paint? Quais argumentos usar. Poderiam dar um exemplo:
A classe MediaBean seria a minha classe do bean onde faço o setLogo() ? Digo, a classe Clube tem um logo (campo byte). Seria nesta classe que eu usaria o paint? Ou na classe de controle da página?

E a classe MediaData devo utilizar a classe do exemplo ou construir uma classe? Neste caso, que atributos deveriam ter esta classe?

Obrigado.

9 Respostas

F

Boa tarde,

Estou com o mesmo problema que o seu, você conseguiu resolver o problema?

Grato.

L

Com a sua imagem crie um BufferedImage e depois use assim na pagina:

<a4j:mediaOutput createContent="#{bean.getImageFromTimeSeriesChart}"
					mimeType="image/png" element="img" cacheable="false" session="true"
					standby="Carregando gráfico..." />

e no seu bean crie um metodo com o seguinte formato:

public void getImageFromTimeSeriesChart(OutputStream out, Object data) {

 byte b[] = carregue os bytes da sua imagem aki.
BufferedImage  result = read(b);
ImageIO.write(result, "png", out);
}

neste metodo eu pego a minha imagem e transformo em um BufferedImage que no caso coloco na variavel result

/**
	 * // Método que transforma um array de bytes em um BufferedImage
	 * 
	 * @author LEANDRO de Godoy
	 * @date 09/08/2010
	 * 
	 * @param bytes
	 * @return
	 */
	public static BufferedImage read(byte[] bytes) {
		try {
			return ImageIO.read(new ByteArrayInputStream(bytes));
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

Qualquer coisa avisa aew.
T+

F

Então, eu tenho que fazer isso mais em um rich:dataTable e não estou conseguindo passar a imagem, tem ideia de como fazer isso?

Grato.

L

fernandosc:
Então, eu tenho que fazer isso mais em um rich:dataTable e não estou conseguindo passar a imagem, tem ideia de como fazer isso?

Grato.

vc quer exibir a imagem em uma celula do rich:DataTabel?
Bom nunca precisei fazer isso mas acredito que da maneira que descrevi acima seja possivel,faca um teste ai e va postando as duvidas.
pegue os bytes da imagem do banco e trasforme em um bufferedImage e depois faca como demonstrei acima usando a tag a4j:mediaOutPut

F

Então cara funcionou! Mais eu fiz para uma foto só, agora eu quero exibir em um dataTable que em cada linha vai ter uma foto, alguma idéia?

Obrigado.

F
Estou tentando passar o byte[] por parametro. Tentei assim:
<rich:dataGrid var="eventoMonitor" value="#{eventoUsMB.listaEventosGeneric}"  columns="4" elements="4"
                                        id="tabelaMonitor">
                            <rich:panel style="width: 250px">
                                <div align="center">
                                    <rich:panel style="border: 1; height: 100px;width: 100px" >
                                        <a4j:mediaOutput createContent="#{eventoUsMB.converteImagem}"
                                            mimeType="image/jpeg" element="img" cacheable="false" session="true"
                                            standby="Carregando imagem...">
                                            <f:param value="#{eventoMonitor.imagem}" name="imagemMonitor"/>
                                        </a4j:mediaOutput>
                                    </rich:panel>
E no meu MB:
public void converteImagem(OutputStream out, Object data) throws IOException{
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest();
        byte imagem[] = (byte)req.getParameter("imagemMonitor");

        BufferedImage result = read(imagem);
        ImageIO.write(result, "jpeg", out);

    }

E não estou conseguindo jogar o parâmetro na imagem[], ele fala que o tipo é incompatível.

Obrigado.

L

tente usar mimeType=“image/png”

A

Estou com o mesmo problema, essa solução funcionou ?
:shock:
Revirei a internet e nao consegui resolver meu problema.

C

Tava quebrando a cabeça aqui resolvendo esse problema
e o código que funcionou direitinho dentro do dataTable comigo foi:

&lt;rich:column&gt;
	&lt;a:mediaOutput element="img" mimeType="image/jpg"
	createContent="#{quoteHome.getBytesImagensDisponiveis}" value="#{category.imagem}" cacheable="false" session="true"
	styleClass="propriedadesDeimagem" /&gt;
&lt;/rich:column&gt;

e na minha Bean

public void getBytesImagensDisponiveis(OutputStream out, Object data) throws IOException {
	String img = (String) data;
	FileInputStream f = new FileInputStream(img);
	BufferedImage result = ImageIO.read(f);
	ImageIO.write(result,"jpeg", out);
}

Lembrando que no data ele já passa o nome da imagem definido no value do a4j:mediaOutput

Abraços… espero ter ajudado

Criado 17 de junho de 2009
Ultima resposta 4 de abr. de 2011
Respostas 9
Participantes 6