Imagem de byte[] para StreamedContent

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.

Voce nao falou o principal…

qual é o problema que vc esta tendo?

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.

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

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.

coloca a datatable inteira ai

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

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?

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.

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

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(); }

IAE CARA… deu certo?

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

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

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