Recuperar imagem (blob) do Banco MySQL + JSF
Eu tenho uma tabela chamada produtos... ( ID, PRODUTO, IMAGEM )
Consegui fazer o input das informações e da imagem, porem estou tendo dificuldade de recuperar a imagem do banco conforme o Id do produto!
Como posso resolver esse problema sem utilizar Servlets?!
Diego Alves
Curtidas 0
Respostas
Davi Costa
23/09/2010
Explica melhor a tua dificuldade,
de ante mão pode colocar a implementação na tua classe
controller. Ou criar uma classe Utilitária para no teu
managed bean tu só chamar esse método.
Espero ter ajudado
Att Davi
de ante mão pode colocar a implementação na tua classe
controller. Ou criar uma classe Utilitária para no teu
managed bean tu só chamar esse método.
Espero ter ajudado
Att Davi
GOSTEI 0
Diego Alves
23/09/2010
Segue o que estou tentando fazer...
#### PRODUCT.JSP ####
#### ENTIDADE PRODUCT ####
#### DAO do Produto ####
Dificuldade está sendo na hora de recuperar a imagem da base!
Como posso fazer?! vlw
<f:view>
<h:outputText value="The Products" /> <h1/>
<h:dataTable border="1" var="item" value="#{ProductFace.products}" styleClass="centralizar" >
<h:column>
<f:facet name="header">
<h:outputText value="ID DO PRODUTO"/>
</f:facet>
<h:outputText value="#{item.id_Product}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="NOME DO PRODUTO"/>
</f:facet>
<h:outputText value="#{item.nameProduct}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="IMAGEM"/>
</f:facet>
<h:graphicImage value="#{item.imagem2}" style="width: 65px; height: 55px;"/>
</h:column>
</h:dataTable>
</f:view>
public class Product implements java.io.Serializable {
private Integer id_Product;
private String NameProduct;
private File imagem; // Input da Imagem no Banco
private BufferedImage imagem2; // Recupera Imagem do Banco
public Product() {
}
public String getNameProduct() {
return NameProduct;
}
public void setNameProduct(String NameProduct) {
this.NameProduct = NameProduct;
}
public Integer getId_Product() {
return id_Product;
}
public void setId_Product(Integer id_Product) {
this.id_Product = id_Product;
}
public File getImagem() {
return imagem;
}
public void setImagem(File imagem) {
this.imagem = imagem;
}
public BufferedImage getImagem2() {
return imagem2;
}
public void setImagem2(BufferedImage imagem2) {
this.imagem2 = imagem2;
}
}
import br.com.classes.Connector;
import br.com.classes.Product;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.io.*;
public class ProductDAO extends Connector {
public ProductDAO() {
super();
}
// Aqui está add Imagem
public boolean add(Product prod) throws ClassNotFoundException, SQLException, FileNotFoundException, IOException {
FileInputStream fis = null;
fis = new FileInputStream(prod.getImagem());
PreparedStatement ps = (PreparedStatement) getPreparedStatement("INSERT INTO DBAPRENDIZ.PRODUCT (NameProduct, Imagem) values ( ?, ?)");
ps.setString(1, prod.getNameProduct());
ps.setBinaryStream(2, fis, (int) prod.getImagem().length());
int toReturn = ps.executeUpdate();
ps.close();
return toReturn > 0;
}
public List<Product> getAllProducts() throws ClassNotFoundException, SQLException, IOException {
List<Product> toReturn = new LinkedList<Product>();
PreparedStatement ps = (PreparedStatement) getPreparedStatement("SELECT * FROM DBAPRENDIZ.PRODUCT ");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Product prod = new Product();
popularProd(prod, rs);
toReturn.add(prod);
}
rs.close();
closeAll();
return toReturn;
}
public void popularProd(Product prod, ResultSet rs) throws SQLException, IOException {
prod.setId_Product(rs.getInt("id_Product"));
prod.setNameProduct(rs.getString("NameProduct"));
/// Como Recuperar a Imagem da Base de Dados aqui
}
}
GOSTEI 0
Davi Costa
23/09/2010
Seguinte troca o file por :
private byte[] imagem;
Creio eu que não vá mais precisar de :
private BufferedImage imagem2; // Recupera Imagem do Banco
Testa se continua salvando direitim.
E depois vc vai pegar esse array de bytes do banco e disserializar(gravar) em uma pasta temporária
no servidor, por isso é p outros motivos de banco essa não é melhor estratégia.
e na jsp
coloca:
<h:graphicImage value="/caminho onde a imagem é salva" style="width: 65px; height: 55px;"/>
Melhor seria vc salvar só a String com o caminho onde grava esse arquivo e na jsp
mantém que nem está acima. Vai ser melhor p banco, melhor para a aplicação.
Vai ser até mais fácil de codificar.
Att Davi
private byte[] imagem;
Creio eu que não vá mais precisar de :
private BufferedImage imagem2; // Recupera Imagem do Banco
Testa se continua salvando direitim.
E depois vc vai pegar esse array de bytes do banco e disserializar(gravar) em uma pasta temporária
no servidor, por isso é p outros motivos de banco essa não é melhor estratégia.
e na jsp
coloca:
<h:graphicImage value="/caminho onde a imagem é salva" style="width: 65px; height: 55px;"/>
Melhor seria vc salvar só a String com o caminho onde grava esse arquivo e na jsp
mantém que nem está acima. Vai ser melhor p banco, melhor para a aplicação.
Vai ser até mais fácil de codificar.
Att Davi
GOSTEI 0
Dyego Carmo
23/09/2010
Eu não costumo fazer assim , no caso de imagens seria melhor voce criar uma servlet para recuperar esta imagem do banco... ai na tela voce colocaria o endereco da servlet...
Costuma funcionar melhor...
ValeuZ
Costuma funcionar melhor...
ValeuZ
GOSTEI 0
Diego Alves
23/09/2010
Entendi... vamos lá!
Fiz um Servlet pra recuperar do banco de dados!
Fiz a seguinte modificação... no código!
Dyego como posso pegar o Id do produto e pasasr para o ServLet?!?!
<h:column rendered="false">
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:outputText id="id_Product" value="#{item.id_Product}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="IMAGEM"/>
</f:facet>
<h:graphicImage value="DisplayImage" style="width: 65px; height: 55px;"/>
</h:column>
GOSTEI 0
Dyego Carmo
23/09/2010
request.getParameter("id")
GOSTEI 0