Erro ao exibir imagens + Primefaces - RESOLVIDO

14 respostas
D

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:

Jan 29, 2013 11:38:21 AM org.primefaces.application.PrimeResourceHandler handleResourceRequest SEVERE: Error in streaming dynamic resource. null
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 [url]http://vineetreynolds.blogspot.com.br/2011/07/building-dynamic-image-based-carousel.html[/url] eu criei uma classe util e de la eu utilizo o caminho da imagem do BD e converto a mesma:
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;
	}

Esse cara eu chego atraves do retorno do BD

/**
	 * Retorna todos os periodos cadastrados
	 * 
	 * @return List<Perfil>
	 */
	public List<Aluno> 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;
	}

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 ´

<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>

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

14 Respostas

H

Coloque seu ManagedBean como @SessionScoped.

D

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

D

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

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.

Nas outras somente o erro que citei acima =/

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

vlww

[]s

D

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

V

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

D

Claro ... segue

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

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";  
          
 
    }

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

V

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

H

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

D

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

D

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

O

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.

D

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

D

orxav funcionou, vlwww meu amigo.

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

[]s

O

Legal, cara.
Boa sorte!

Criado 29 de janeiro de 2013
Ultima resposta 31 de jan. de 2013
Respostas 14
Participantes 4