JSF - Carregar imagem armazenada no servidor

4 respostas
paulofafism

Pessoal estou tendo os seguinte problema estou precisando de carregar umas imagens que estão no servidor.
O sistema funciona da seguinte maneira

No meu sistema existe uma tabela chamada PRODUTO onde estão armazendas as caracteristicas do produto. como nome, gramatura, tamanho precço e o caminho das fotos do produtos que serão usadas pelo sistema para carregas as fotos. Em uma outra tabela chamada ESTOQUE são cadastrada os a quantidade de estoque do produto pois cada produto pode ter diversas cores. e o a referência dessas cores e armazena da seguinte forma:
COR: 1012 - C, 5017 - C etc

As imagens são gravadas com os nomes da seguinte forma 1012C.jpg, 5017.jpg

Este e minha classe Estoque que representa a tabela estoque produto neste classe existe um metodo getCaminhoFotoProduto() que monta o caminho da foto do produto. Este método esta me retornando perfeitamente o caminho do produto.

o problema esta na hora de carregar a imagem deste produto que não aparece na pagina
OBS Estou usando um servlet

public String getCaminhoFotoProduto(){
        String[] c = {"/", "-", " "};         
        String path = estoquePK.getProduto().getFotos();
        if (path != null){
            String cor = getCor();
            String aux = cor;            
        
            for(String g : c ){
                aux = aux.replace(g, "");                    
            }        
         
            aux = aux.trim();           
        
            path = path.replace("\\", "\\\\");        
            return path + "\\\\" + corNova + ".jpg";
        }
        else
            return "";
    }

Classe ESTOQUE

@Entity
@Table(name = "ESTOQUE")

public class Estoque implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @EmbeddedId
    protected EstoquePK estoquePK;
    @Column(name = "CODIGOBARRAS")
    private String codigobarras;
    @Column(name = "PRATELEIRA")
    private BigDecimal prateleira;
    @Column(name = "TRANSITO")
    private BigDecimal transito;
    @Column(name = "RESERVADO")
    private BigDecimal reservado;
    @Column(name = "ULTCUSTO")
    private BigDecimal ultcusto;
    @Column(name = "CUSTOMEDIO")
    private BigDecimal customedio;
    @Column(name = "ATIVO")
    private Character ativo;
    @Column(name = "ESTOQUE_MINIMO")
    private BigDecimal estoqueMinimo;     
    
    
    private transient BigDecimal quantidade;     
    
    private transient Boolean marcado;
    
    private transient List color = new ArrayList(); 
    
    //private transient String cor;
     
    public Estoque(){    
        this.estoquePK = new EstoquePK();
        quantidade.valueOf(0.000);
    }  
    
    public Estoque(EstoquePK estoquePK) {
        this.estoquePK = estoquePK;
    }
    
    public Estoque(Produto produto, Cor cor) {
        this.estoquePK = new EstoquePK(produto, cor);
    }
    
    public EstoquePK getEstoquePK() {
        return estoquePK;
    }

    public void setEstoquePK(EstoquePK estoquePK) {
        this.estoquePK = estoquePK;
    }

    public void setMarcado(Boolean marcado){
        this.marcado = marcado;
    }
    
    public Boolean getMarcado(){
        return this.marcado;
    }
    
    public BigDecimal getQuantidade(){
        return this.quantidade;
    }
    
    public void setQuantidade(BigDecimal quantidade){
        this.quantidade = quantidade;
    }
    
    public String getProduto(){    
        return estoquePK.getProduto().getProduto();
    }
    
    public String getCaminhoFotoProduto(){
        String[] c = {"/", "-", " "};         
        String path = estoquePK.getProduto().getFotos();
        if (path != null){
            String cor = getCor();
            String corNova = cor;            
        
            for(String g : c ){
                corNova = corNova.replace(g, "");                    
            }        
        
            corNova = corNova.trim();           
        
            path = path.replace("\\", "\\\\");        
            return path + "\\\\" + corNova + ".jpg";
        }
        else
            return "";
    }
    
    public String getCorTotalEstoque(){
        BigDecimal decimal = new BigDecimal(10.000);
        
        if (this.getPrateleira().compareTo(decimal) == -1){
            return "#ff0000";
        }
        if (this.getPrateleira().compareTo(decimal) == 0){
            return "#ff0000";
        }        
        else
           return "#1F4F77";        
    }
    
    
    
    
    public String getCorHexadecimal(){                        
        /* String delphiColor[]  = {"clWhite",
                "clBlack", "clAgua",
                "clBlue","clYellow", "clSilver", "clRed", "clSilver",
        "clPurple", 
        "clOlive",
        "clNavy",
        "clGray",
        "clLime",
        "clMaroon",
        "clAqua"};
        */
        String c = estoquePK.getCor().getHexadecimal();
        if (c !=null){
            if (c.startsWith("$")){
                c = "#"+c.substring(3);
            }             
        }
        else
            c ="#FFFFFF";
        
        return c;
    }    
    
    public String getGrupo(){
        return estoquePK.getProduto().getGrupoproduto().getDescricao();
    }    
    
    
    public String getCor(){
        return estoquePK.getCor().getCor();
    }    
    
    public String getCodigobarras() {
        return codigobarras;
    }

    public void setCodigobarras(String codigobarras) {
        this.codigobarras = codigobarras;
    }

    public BigDecimal getPrateleira() {
        return prateleira;
    }

    public void setPrateleira(BigDecimal prateleira) {
        this.prateleira = prateleira;
    }

    public BigDecimal getTransito() {
        return transito;
    }

    public void setTransito(BigDecimal transito) {
        this.transito = transito;
    }

    public BigDecimal getReservado() {
        return reservado;
    }

    public void setReservado(BigDecimal reservado) {
        this.reservado = reservado;
    }

    public BigDecimal getUltcusto() {
        return ultcusto;
    }

    public void setUltcusto(BigDecimal ultcusto) {
        this.ultcusto = ultcusto;
    }

    public BigDecimal getCustomedio() {
        return customedio;
    }

    public void setCustomedio(BigDecimal customedio) {
        this.customedio = customedio;
    }

    public Character getAtivo() {
        return ativo;
    }

    public void setAtivo(Character ativo) {
        this.ativo = ativo;
    }

    public BigDecimal getEstoqueMinimo() {
        return estoqueMinimo;
    }

    public void setEstoqueMinimo(BigDecimal estoqueMinimo) {
        this.estoqueMinimo = estoqueMinimo;
    }

}

Trecho de codigo da pagina onde deve aparecer a imagem

<h:inputHidden rendered="true"  binding="#{pedidoFacade.corProdutoController.hiddenFieldFotoProduto}"
                                                 value="#{item.caminhoFotoProduto}" id="hiddenCaminhoFoto"/>                                                                                 
                                    
                                   <h:graphicImage height="80" width="80"                                             
                                                url="/LoadImageHDServlet"   
                                                alt="Clique aqui para remover o item do carrinho"
                                                id="imgProduto1" />
                                
                       </h:column>

Meu DataTable

<h:dataTable  value ="#{pedidoFacade.allProdutos}"
                       var="item" border="0"  
                       cellpadding="2" cellspacing="0" rendered="true"
                       style=" top:270px; left: 48px; position: absolute"
                       width="760"  
                       columnClasses="columnLeft, columnCenter, columnCenter, columnRight, columnCenter, columnCenter"  
                       headerClass="tdHeadTrans"
                       rowClasses="row, row1">                                      
                       
                       <f:facet name="header">
                            <h:outputText value="Cores produtos"/>    
                       </f:facet>
                       
                       <h:column rendered="true" id="columnProduto">
                            <f:facet name="header">
                                <h:outputText value="Produto"/>
                            </f:facet>
                            <h:commandLink rendered="true" styleClass="rowLeft" action="consultaproduto"
                                value="#{item.produto}"/>
                       </h:column>

                       <h:column rendered="true" id="columnCor" >
                            <f:facet name="header">
                                <h:outputText value="Cor"/>
                            </f:facet>                            
                                <h:outputText rendered="true" value="#{item.cor}"/>                                
                       </h:column>                                                                                                                                                                                                                                   
                       
                       <h:column rendered="true" id="columnCor1" >
                            <f:facet name="header">
                                <h:outputText value="Cor"  />
                            </f:facet>                        
                                <h:inputText id="txtColor" readonly="true" rendered="true"
                                    style="background-color: #{item.corHexadecimal}; height: 17px" size="10"/>                                                                  
                       </h:column>                           
                       
                       <h:column rendered="true" id="columnEstoque" >
                            <f:facet name="header">
                                <h:outputText value="Estoque"/>
                            </f:facet>                                  
                                <h:outputText styleClass="Spacetd" 
                                              rendered="true" 
                                              value="#{item.prateleira}"
                                              style="color: #{item.corTotalEstoque}"                                             
                                 />                                                                                            
                       </h:column>                                               
                       
                       <h:column rendered="true" id ="columnQuantidade">                                
                                <f:facet name="header" >
                                    <h:outputText value="Quantidade"/>
                                </f:facet>                                    
                                <h:inputText styleClass="TDinput"  rendered="true" size="5" id="txtQuantidade"
                                             value="#{item.quantidade}"/>
                       </h:column>                          
                       
                       <h:column rendered="true" id ="columnCheckBox">
                                <f:facet name="header" >
                                    <h:outputText value="X"/>
                                </f:facet>           
                                
                                    <h:selectBooleanCheckbox rendered="true" id="chkMarcado"
                                       
                                        value ="#{item.marcado}"                                          
                                 />
                       </h:column>                         
                       
                       <h:column rendered="true" id ="imgProduto">                                
                                <f:facet name="header" >
                                    <h:outputText style="font-weight: bold;" value=""/>
                                </f:facet>                                                                                                                                                                                                                                 
                                
                                   <h:inputHidden rendered="true"  binding="#{pedidoFacade.corProdutoController.hiddenFieldFotoProduto}"
                                                 value="#{item.caminhoFotoProduto}" id="hiddenCaminhoFoto"/>                                                                                 
                                    
                                   <h:graphicImage height="80" width="80"                                             
                                                url="/LoadImageHDServlet"   
                                                alt="Clique aqui para remover o item do carrinho"
                                                id="imgProduto1" />
                                
                       </h:column>                                               
                       
                       <h:column rendered="true" id ="caminhoArquivo">                                
                                <f:facet name="header" >
                                    <h:outputText value="Caminho"/>
                                </f:facet>                                    
                                <h:inputText styleClass="TDinput"  rendered="true" size="5" id="txtCAMINHO"
                                             value="#{item.caminhoFotoProduto}"/>
                       </h:column>                           
                       
                       
                    </h:dataTable>

MEU SERVLET

/**
 *
 * Este Servlet carrega um aimagem armazenada no hd
 * @author PAULO
 */
public class LoadImageHDServlet extends HttpServlet {
   
    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */    
    
    public ServletOutputStream doAction(HttpServletRequest request,
                    HttpServletResponse response) throws ServletException {  
         String sFile = "C:\\596598.JPG";                               
         HttpSession s =  request.getSession();                        
         //java.util.Enumeration enu = s.getAttributeNames();         
         PedidoFacade pedido = (PedidoFacade)s.getAttribute("pedidoFacade");                  
         //while (enu.hasMoreElements()){
           // elements = elements + " " + enu.nextElement();
           // javax.swing.JOptionPane.showMessageDialog(null, "E32LEMENTOS" + elements);            
         //}                 
         if (pedido != null){
             if (pedido.getCorProdutoController() != null){                              
                sFile = (String)pedido.getHiddenFieldFotoProduto().getValue();
                System.out.println("TESTE:" + sFile);
             }
         }
         else
            sFile = "C:\\596598.JPG"; 
            //javax.swing.JOptionPane.showMessageDialog(null, "E32LEMENTOS" + pedido);       
         
         try{                    
             File file = new File(sFile);  
             return download( file.getName(), read( file ), response );                 
         }catch( IOException e ) {  
             try {  
                 throw new IOException(e.getMessage());  
             } catch (IOException ex) {  
                 ex.printStackTrace();  
                 throw new ServletException(e.getMessage() + " :: DownloadAnexoDocumentoCommand :: Erro ao carregar arquivo");  
             }  
         }  
     }  

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException {          
         doAction(request, response);
    }            

    public void read2(File file) throws IOException{
        byte[] b = new byte[(int)file.length()];
        BufferedImage out = ImageIO.read(file);         
        ByteArrayInputStream in =new ByteArrayInputStream(b);         
    }
    
    // Lê o arquivo no servidor  
    public byte[] read( File file ) throws IOException {  
           
         byte[] content = null;  
         int fileLength = (int) file.length();  
         FileInputStream fileInput = null;  
           
            try{               
                fileInput = new FileInputStream(file);  
               
                BufferedInputStream bufferedInput = new BufferedInputStream(  
                         fileInput);  
                
                content = new byte[fileLength];  
                bufferedInput.read(content, 0, fileLength);  
                bufferedInput.close();               
                
            }finally {  
                 if (fileInput != null) {  
                     fileInput.close();  
            }  
                 
         } 
         
         return content;  
     }      
    
    
     public ServletOutputStream download( String filename, byte[] content,  
             HttpServletResponse response ) throws IOException {  
           
         //response.addHeader( "Content-Disposition",  
         //      "attachment; filename=" + filename );  
         //response.setContentType( "image/jpeg" );  
           
         ServletOutputStream outStream = response.getOutputStream();          
           
         // envia o conteúdo do arquivo para o stream de resposta  
         try{  
            outStream.write( content );          
            outStream.flush();  
         }finally {  
            outStream.close();  
         }   
         return outStream;  
     }  
     
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
    * Handles the HTTP <code>GET</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
    * Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
    * Returns a short description of the servlet.
    */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}

4 Respostas

B

Seu getCaminhoFotoProduto() retorna apenas o caminho ou retorna tbm o conteudo da foto??

paulofafism

Este método ja retorna o caminho completo da imagem

Exemplo se a referência do produto é 1012 - C e no cadastro do produto esta o apontado para caminho C:\FOTOS\Produto\

este método vai me retornar C:\FOTOS\Produto\1012C.jpg que é nome da foto

B

Paulo não sei se isso pode te ajudar,
Uma vez montei algo que recuperava um blob
do banco e passava a imagem para o ireport…
Se o seu getImagem retornar o caminho e tbm uma string com sua foto
vc pode tentar guardar a string em um ImageIcon e chamar na página o bufferedImage…
Lembro que pesquisei neste tópico:

http://www.guj.com.br/posts/list/43670.java#230452

paulofafism

Detalhe ao inves de eu colocar na propriedade value o bean com o caminho da foto e colocar a caminho digitado manualmente a foto aparece, mas o problema se eu informar o caminho manualmente ele ira repetir as fotos para outros produtos

<h:inputHidden rendered="true" binding="#{pedidoFacade.corProdutoController.hiddenFieldFotoProduto}" value="#{item.caminhoFotoProduto}" id="hiddenCaminhoFoto"/>

</h:column>                           
                          
                        <h:column rendered="true" id ="imgProduto">                                  
                                 <f:facet name="header" >  
                                     <h:outputText style="font-weight: bold;" value=""/>  
                                 </f:facet>                                                                                                                                                                                                                                   
                                  
                                    <h:inputHidden rendered="true"  binding="#{pedidoFacade.corProdutoController.hiddenFieldFotoProduto}"  
                                                  value="C:\\FOTOS\\PV\\1012.JPG" id="hiddenCaminhoFoto"/>                                                                                   
                                       
                                    <h:graphicImage height="80" width="80"                                               
                                                 url="/LoadImageHDServlet"     
                                                 alt="Clique aqui para remover o item do carrinho"  
                                                 id="imgProduto1" />  
                                   
                        </h:column>
Criado 20 de abril de 2008
Ultima resposta 22 de abr. de 2008
Respostas 4
Participantes 2