Erro ao exibir imagens + Primefaces - RESOLVIDO

Fala pessoal, mais uma vez venho pedir uma ajuda a vcs.
Eu tenho um sistema onde em uma consulta tenho que exibir as fotos dos alunos(caminho salvo na base e imagem salva em uma pasta).
A imagem é gerada esta tudo ok nessa parta mas qdo vou exibir aparece o seguinte erro:

[quote]Jan 29, 2013 11:38:21 AM org.primefaces.application.PrimeResourceHandler handleResourceRequest
SEVERE: Error in streaming dynamic resource. null[/quote]
Cheguei a pesquisar na net e o que encontrei esta igual ao que fiz um dos locais que encontrei foi uma dica do forum do proprio primefaces http://vineetreynolds.blogspot.com.br/2011/07/building-dynamic-image-based-carousel.html

eu criei uma classe util e de la eu utilizo o caminho da imagem do BD e converto a mesma:

[code] public static StreamedContent imagem(String caminhoImagem) {

	StreamedContent imagem = null;

	File f = new File(caminhoImagem);
	if (f.exists()) {
		InputStream stream = null;
		try {
			stream = new FileInputStream(f);
			imagem = new DefaultStreamedContent(stream, "image/jpeg");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	return imagem;
}[/code]

Esse cara eu chego atraves do retorno do BD

[code] /**
* Retorna todos os periodos cadastrados
*
* @return List
*/
public List listaAlunos() {

	Conexao conexao;
	String sql = "";
	List<Aluno> listaAlunos = new ArrayList<Aluno>();

	sql = "select aluno_id, aluno_nome, aluno_dtnasc, aluno_pai, aluno_mae, aluno_sexo, "
			+ "aluno_natural, aluno_endereco, aluno_endnumero, aluno_endcomplemento, "
			+ "aluno_bairro, aluno_estado, aluno_cidade, aluno_fone, aluno_dtmatricula, "
			+ "aluno_ra, aluno_rm, aluno_email, aluno_livro, aluno_serieatual, "
			+ "aluno_folha, aluno_foto, aluno_idsala "
			+ "from alunos "
			+ "order by aluno_nome";

	try {

		conexao = Conexao.getInstance();
		PreparedStatement stm = conexao.getConexao().prepareStatement(sql);
		ResultSet res = stm.executeQuery();

		while (res.next()) {
			Aluno aluno = new Aluno();

			aluno.setIdAluno(res.getInt("aluno_id"));
			aluno.setNomeAluno(res.getString("aluno_nome"));
			aluno.setDtNascimento(res.getDate("aluno_dtnasc"));
			aluno.setNomePai(res.getString("aluno_pai"));
			aluno.setNomeMae(res.getString("aluno_mae"));
			aluno.setSexo(res.getString("aluno_sexo"));
			aluno.setNatural(res.getInt("aluno_natural"));
			aluno.setEndereco(res.getString("aluno_endereco"));
			aluno.setEndNumero(res.getString("aluno_endnumero"));
			aluno.setEndComplemento(res.getString("aluno_endcomplemento"));
			aluno.setBairro(res.getString("aluno_bairro"));
			aluno.setEstado(res.getInt("aluno_estado"));
			aluno.setCidade(res.getInt("aluno_cidade"));
			aluno.setFone(res.getString("aluno_fone"));
			aluno.setDtMatricula(res.getDate("aluno_dtmatricula"));
			aluno.setRa(res.getInt("aluno_ra"));
			aluno.setRm(res.getInt("aluno_rm"));
			aluno.setEmail(res.getString("aluno_email"));
			aluno.setLivro(res.getString("aluno_livro"));
			aluno.setSerie(res.getString("aluno_serieatual"));
			aluno.setFolha(res.getInt("aluno_folha"));
			aluno.setAluno_foto(res.getString("aluno_foto"));
			aluno.setAluno_idsala(res.getInt("aluno_idsala"));
			aluno.setImagem(Uteis.Uteis.imagem(res.getString("aluno_foto")));

			listaAlunos.add(aluno);

		}

	} catch (SQLException e) {

		e.printStackTrace();
		return null;

	} catch (Exception e) {

		e.printStackTrace();

		return null;

	}

	return listaAlunos;
}[/code]

O retorno para o xhtml é feito por uma lista

public void carregalistaAlunos(){ lstAlunos = ControleFactory.getInstance().getAlunoscontrole().listaAlunos(); }

Essa lista é do tipo mensalidade que populo pelo select que enviei.

Nessa classe utilizo SessionScoped mas tambem tentei RequestScoped(que estava no exemplo da url acima).

Até aqui vai tudo que é uma blz mas qdo vou exibir o erro citado acima acontece.
O trecho do xhtml onde tento exibir a imagem ´

[code] <p:carousel id=“carrossel” value="#{consalunosBean.lstAlunos}" var=“aluno” headerText=“Alunos”>
<p:graphicImage id=“image” value="#{aluno.imagem}"/>

    <h:panelGrid columns="2" style="width:100%" cellpadding="5">  
        <h:outputText value="Nome: " /><h:outputText id="nome" value="#{aluno.nomeAluno}" />  
    </h:panelGrid>   

</p:carousel> [/code]

no web.xml ja configurei tb

<mime-mapping> <extension>jpg</extension> <mime-type>image/jpeg</mime-type> </mime-mapping>

Então ja quebrei a cabeça, encontrei algumas coisas mas não foge do que fiz.
Se alguem souber o que pode ser agradeço muito.

Vlwww pessoal

[]s

Coloque seu ManagedBean como @SessionScoped.

Fala Hebert, blz?
Então cara ja esta =/

@ManagedBean(name = "consalunosBean") @SessionScoped public class ConsAlunosBean { . . .

Eu tenho outra tela que mostra somente uma imagem e la funciona sem problemas.
Só nessa que são N imagens que o erro ocorre.
Tem mais alguma ideia do que posso verificar?

Vlwww

[]s

Putz, um detalhe que verifiquei somente agora, na primeira vez que acesso a pagina tb ocorre o erro:

[quote]Jan 29, 2013 12:09:48 PM com.sun.faces.context.ExternalContextImpl getMimeType
WARNING: JSF1091: No mime type could be found for file dynamiccontent. To resolve this, add a mime-type mapping to the applications web.xml.[/quote]

Nas outras somente o erro que citei acima =/

O que me estranha nesse erro é que esta configurado no web.xml.

vlww

[]s

Resolvido, tem hora que preciso deixar as coisas mais simples =)
Eu simplesmente peguei o caminho da imagem e mandei exibir na tela

O problema resolvi, mas ainda não sei o pq não funcionou da primeira maneira.
Obrigado pela ajuda pessoal.

[]s

Cara poderia me mandar a parte que você salva no disco ?

Claro … segue

onde capturo a imagem e dou um nome e o local a ser salvo

[code] public void oncapture(CaptureEvent captureEvent) {

     photo = cpf.replaceAll("[^0-9]", "");
    this.photos.add(0,photo);  
     data = captureEvent.getData();  
     String caminhoImagem = ControleFactory.getInstance().getParametrosControle().parametros().getCaminhoImagem();
      
    //ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();  
     newFileName = caminhoImagem + File.separator + photo + ".png";  
      

} [/code]

e para salvar

FileImageOutputStream imageOutput; try { imageOutput = new FileImageOutputStream(new File(newFileName)); imageOutput.write(data, 0, data.length); imageOutput.close(); } catch(Exception e) { throw new FacesException("Error in writing captured image."); }

[]s

Para mostrar a imagem você só diz o caminho ?

[quote=Valeio Bezerra]Para mostrar a imagem você só diz o caminho ? [/quote]Você tentou? O que aconteceu? [=

Sim, a tarde eu somente tinha acesso ao IE … mas no FF e Chrome não funciona =/
Vou continuar pesquisando e assim que encontrar uma solução posto aqui e se alguem encontrar e quiser postar aqui agradeço =)

Isso para o caso de aparecer mais de uma imagem na mesma tela, qdo eu quero que somente uma apareça utilizei

File f = new File(getAlunos.getCaminhoImagem()); if( f.exists()){ InputStream stream = null; try { stream = new FileInputStream(f); imagem = new DefaultStreamedContent(stream, "image/jpeg"); setImagem(imagem); } catch (Exception e){ e.printStackTrace(); } }

e a variavel imagem é do tipo StreamedContent

[]s

Boa tarde pessoal,
Continuo batendo cabeça com esse caso.
Porem eu percebi o seguinte, se eu declaro uma variavel do tipo StreamedContent no Bean fazendo a conversão de onde a imagem esta(caminho da imagem no servidor) a mesma é exibida.
Porém se vem da lista não aparece.
Alguem tem alguma ideia do que é?
Depois de 2 dias batendo cabeça não tenho mais ideias, ja vasculhei em tudo q é canto na net mas não vai =/
Se coloco o caminho fisico no xhtml o IE consegue mostrar a imagem mas o FF e Chrome não.
Se alguem puder dar um help agradeço e muito.

Vlwww pessoal.

[]s

Fala, @denis_gariglio. Tudo beleza?

Se você estiver salvando a imagem em algum diretório externo, você pode resolver isso via Servlet.
Crie um servlet que retorne o path da imagem desejada. Depois basta chamar sua imagem na tela.

Exemplo:
No teu Servlet, você define o ContentType como image/jpg, ou o que for necessário: response.setContentType("image/jpg");
Esse Servlet recebe um identificador e retorna a imagem referente à ele.
Basta você tratar a imagem dentro do Servlet e e retorná-la na response.

Pega essa referência, que você resolve seu problema: http://balusc.blogspot.com.br/2007/04/imageservlet.html
Abraço.

Vlwww orxav vou montar aqui e assim que finalizar eu volto a postar.
=)

orxav funcionou, vlwww meu amigo.

Eu implementei o servlet exatamente como esta no site e funcionou perfeitamente.
Muito obrigado pela ajuda.

[]s

Legal, cara.
Boa sorte!