Imagem de byte[] para StreamedContent

14 respostas
F

Boa Tarde Galera,

To com um problema e preciso da ajuda de vocês.

Preciso gravar uma imagem no banco dados e recupera-lá para exibição.
Consigo gravar tranquilamente, no java uso uma variavel byte[] e passo ela para um atributo blob no mysql, até ai tranquilo, funcionando corretamente.

Na hora de recuperar, tenho um problema, pois pego ela como byte e preciso jogar em um StreamedContent para exibir com um graphicImage do primefaces 2.2.1

Abaixo o metodo DAO:

public List<ImagemBean> getImagem() {
        String sql = "select * from tbl_imagem";
        List<ImagemBean> lista = new ArrayList<ImagemBean>();
        ImagemBean imagem = new ImagemBean();
        try {
            PreparedStatement preparedStatement = (PreparedStatement) FabricaConexao.getPreparedStatement(sql);

            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                imagem.setId(resultSet.getInt("id"));
                imagem.setAlt(resultSet.getString("alt"));
                imagem.setImagem(resultSet.getBytes("imagem"));
                
                imagem.setImagemStreamed(new DefaultStreamedContent(new ByteArrayInputStream(imagem.getImagem())));
                System.out.println("ImagemStreamed: "+imagem.getImagemStreamed().getName());
                lista.add(imagem);
            }

        } catch (SQLException ex) {
            Logger.getLogger(MostraImagemDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(MostraImagemDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lista;
    }

Basicamente faço o seguinte:
Crio uma lista e um objeto ImagemBean, nesse imagemBean tenho um campo imagemStreamed do tipo StreamedContent e um campo imagem do tipo byte.
Basicamente recupero a imagem ainda em byte e jogo para o campo imagem e ai tento converter de byte e jogar para o campo imagemStreamedContent.

E para exibir:

<p:graphicImage value="#{lista.imagemStreamed}" alt="Teste" cache="false"/>

Isso dentro de um DataTable.

Alguem consegue localziar algum erro?

Uso Netbeans 7
Tomcat 7
Primefaces 2.2.1

Agradeço muito a ajuda.

14 Respostas

E

Voce nao falou o principal…

qual é o problema que vc esta tendo?

F

Desculpa, não deixei claro.

O graphicImage do primefaces não exibe a imagem.

Os dados estao vindo do banco de dados, porém, a imagem não é exibida.

Acredito que seja na hora de converter de byte[] para StreamedContent.

E

Normal

é um BUG do prime faces… alias um dos bugs… veja esta solução

no get do seu StreamedContent no MB temque fazer algo deste tipo

public StreamedContent getImagem() {
        String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("image_id");
        if (id != null) {
            Long imagemId = Long.parseLong(id);
            for (Candidato c : getCandidatos()) {
                if (c.getId() == imagemId) {
                    this.imagem = c.getImagem();
                    return imagem;
                }
            }
        }
        this.imagem = new DefaultStreamedContent();
        return imagem;
    }

e no .xhtml

<h:dataTable id="idcandidatos"
value="#{candidatoMB.candidatos}" var="candidato">
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Nome"/>
                    </f:facet>
                    <h:outputText value="#{candidato.nome}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Foto"/>
                    </f:facet>
                    <p:graphicImage value="#{candidatoMB.imagem}">
                        <f:param name="image_id"
value="#{candidato.id}"/>
                    </p:graphicImage>
                </h:column>
            </h:dataTable>

pois ele se perde quando renderiza…
Obs: tem que usar o scoped de sessão

Obs: vc usa o select no get da imagem? não é estranho isto? coloca no construtor…

depois posta ai pra ver se deu certo

F

Opa,

Esse select ta numa classe chamada MostraImagemDAO, o nome da classe tá errado, devo trocar para outro nome, se não vai causar confusão.

Sobre o código que me passo, não sei se funciono pois o seguinte trecho (abaixo) não passa o f:param

<h:column>
     <f:facet name="header">
          <h:outputText value="Imagem"/>
      </f:facet>
      <p:graphicImage value="#{mostraImagemManagedBean.imagem}">
          <f:param name="idImagem" value="#{lista.id}"/>
      </p:graphicImage>
</h:column>

No ManagedBean

String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("idImagem"); System.out.println("Entro no getImagem id = " +id);

Ai na saida, sempre aparece a mensagem “Entro no getImagem id = null”

Já teve algum erro parecido com esse?
O f:param não é disparado, pois no codigo do navegador nao aparece o f:param anexado ao link.

E

coloca a datatable inteira ai

F
<h:dataTable value="#{mostraImagemManagedBean.lista}" var="lista" id="lista">
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="ID"/>
                        </f:facet>
                        <h:outputText value="#{lista.id}"/>
                    </h:column>

                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="Imagem"/>
                        </f:facet>
                        <h:column>  
                            <f:facet name="header">  
                                <h:outputText value="Imagem"/>  
                            </f:facet>  
                            <p:graphicImage value="#{mostraImagemManagedBean.imagem}">  
                                <f:param name="idImagem" value="#{lista.id}"/>  
                            </p:graphicImage>  
                        </h:column>  
                       
                    </h:column>

                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="Alt"/>
                        </f:facet>
                        <h:outputText value="#{lista.alt}"/>
                    </h:column>
                </h:dataTable>
E

QUal scopo vc está usando ?

e quando que vc faz isso

String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("idImagem");    
           System.out.println("Entro no getImagem id = " +id);

vc tentou fazer o exmplo inteiro e nao apareceu a imagem?

F

SessionScoped

Já sim, mas ele não chega a executar, pois como o id nao é passado, o codigo nao consegue pegar a imagem correta.

Tive alguns avanços usando o a4j:mediaOutput.
Ele resgata a imagem correta e tudo mais, porém, quando a pagina é atualizada, a imagem se perde.
Teria alguma sugestão?

Vou tentar resolver isso e postar o projeto inteiro, muita gente tem duvida sobre isso e as resoluções são dificeis de ser encontradas.
Ajudaria bastante.

E

tem um blog com uma solução completa,fiquei um mes pra resolver isto …

,tem meus comentarios que vai ajudar bastant

se não conseguir posta aqui

A

Sofri com isso também amigo, arrumei uma solução num blog desse da vida, somente adaptei um pouco.
Não sei se é a melhor forma, mas esse negócio é tão chato pra resolver que eu deixei assim mesmo.

OBS: Acabei de ver que o blog foi esse indicado acima.

public StreamedContent getDynamicImage() { String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("imagemnome"); if (id != null && this.getImagens() != null && !this.getImagens().isEmpty()) { for (Image imgTemp : this.getImagens()) { if (imgTemp.getName().equals(id)) { return imgTemp.getImagem(); } } } if (id != null) { return getImagens().get(getImagens().size() - 1).getImagem(); } return new DefaultStreamedContent(); }

E

IAE CARA… deu certo?

F

Opa,

Mal a demora,

Então cara, resolvi em partes, não utilizei primefaces, usei o a4j:mediaOutput.
Ele exibe todas as imagens, tudo certo, porém, tem algum erro de lógica, que faz ele exibir as imagens em ordem diferente toda vez que a página é carregada?

Se tiver precisando do projeto, me fala que eu upo pro megaupload.

Vlw

E

tranquilo, era só pra saber se deu certo… valew

L

Cara, tenho um erro parecido.

Mas estou apenas no richfaces.

Sem contar que toda vez que tento renderizar minha imagem utilizando:

public void paint(OutputStream stream, Object object) throws IOException { stream.write(files.get((Integer) object).getData()); }

Ele instancia novamente a classe, ou seja, faz a leitura completa do meu MB fazendo com que as variáveis e etc, percam o contexto e sejam limpas.
Resultado é que perco meu array de bytes contendo minhas imagens.

No meu xhtml está assim:

<a4j:mediaOutput element="img" mimeType="{file.mime}" createContent="#{produtoManager.paint}" value="#{row}" style="width:100px; height:100px;"> <f:param value="#{produtoManager.timeStamp}" name="time"/> </a4j:mediaOutput>

Já varri o código inteiro do MB e não encontrei o que faz ele voltar ao Create.

Se alguém puder ajudar. =D

Criado 19 de julho de 2011
Ultima resposta 16 de jul. de 2012
Respostas 14
Participantes 4