Gravar e buscar imagem no banco de dados [RESOLVIDO]

8 respostas
H

Pessoal,

- Estou desenvolvendo uma aplicação com Hibernate onde tenho que gravar e buscar imagem no banco de dados.
- No banco de dados defini um campo FOTO como tipo blob

Estou conseguindo gravar a imagem perfeitamente no banco de banco utilizando este comando public static void main(String[] args){
RegistroDao regDao = new RegistroDao();
		Registro reg = new Registro();		
		byte[] foto = null;
		BufferedImage imagem;
		try {		
			//Ler a imagem do caminho especificado
			imagem = ImageIO.read(new File("C:/h.png"));
			//converte a BufferedImage em byte[]
			foto = ((DataBufferByte)((BufferedImage)imagem).getRaster().getDataBuffer()).getData();
		
			reg.setId(2);
			reg.setNome("hvivox");
			reg.setFoto(foto);
			regDao.salvar(reg);	
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

Porém minha dificuldade é como buscar esta informação do banco de dados e exibir no formato de imagem. Tentei utilizar os comando abaixo porém não tive sucesso.

public void exibirFoto(){
		RegistroDao regDao = new RegistroDao();
		Registro reg = new Registro();		
		byte[] foto = null;
		
		//LENDO E COPIANDO IMAGEM ##############################################
		//BufferedImage imagem;
		 BufferedImage img = null; 
		reg = regDao.findById(4);
		
try {
			img = ImageIO.read(new ByteArrayInputStream(reg.getFoto()));//getFoto() é do tipo byte[]
			ImageIO.write(img, "PNG", new File("C:/Downloads/h.png"));
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}

Alguém tem uma sugestão melhor para buscar a informação no banco de dados e converter em imagem??? Lembrando que estou recebendo a informação como byte[] minha dificuldade é converter ele em um formato de imagem.

grato.

8 Respostas

H

Também tentei estes comandos

Image image = Toolkit.getDefaultToolkit().createImage(reg.getFoto()); 
lblFoto.setIcon(new ImageIcon(image));

Não é mostrado erro, porém o JFrame não exibe a imagem na tela. O que deve está faltando??

V

Você leu a documentação do método getData() do DataBufferByte?

Ele é bem claro:

Ou seja, ele retorna apenas o primeiro bank da imagem.

Talvez esse post aqui te ajude:

H

ViniGodoy:
Você leu a documentação do método getData() do DataBufferByte?

Ele é bem claro:

Ou seja, ele retorna apenas o primeiro bank da imagem.

Talvez esse post aqui te ajude:
http://intelectolivre.blogspot.com/2008/07/exibindo-gravando-e-recuperando-imagens.html

Vini, mto obrigado graça a sua ajuda consegui resolver o problema.
A solução foram estas

  • PARA SALVAR OU GRAVAR A IMAGEM NO BANCO UTILIZEI ESTES COMANDOS
//Ler a imagem do caminho especificado
			imagem = ImageIO.read(new File("C:/logo.png"));
			//OBTEM A IMAGEM E TRANSFORMA EM BYTES[]
			ByteArrayOutputStream bytesImg = new ByteArrayOutputStream();
			ImageIO.write((BufferedImage)imagem, "jpg", bytesImg);//seta a imagem para bytesImg
			bytesImg.flush();//limpa a variável
			byte[] byteArray = bytesImg.toByteArray();//Converte ByteArrayOutputStream para byte[] 
			bytesImg.close();//fecha a conversão
			
			reg.setId(7);
			reg.setNome("Leomara");
			reg.setFoto(byteArray);
			regDao.salvar(reg);

PARA BUSCAR E EXIBIR A IMAGEM DO BANCO DE DADOS UTILIZEI ESTES COMANADOS

public void exibirFoto(){
		RegistroDao regDao = new RegistroDao();
		Registro reg = new Registro();		
		byte[] foto = null;
		
		//LENDO E COPIANDO IMAGEM ##############################################
		BufferedImage img = null; 
		reg = regDao.findById(7);
								
		try {
			img = ImageIO.read(new ByteArrayInputStream(reg.getFoto()));
			lblFoto.setIcon(new ImageIcon(img));	
			ImageIO.write(img, "PNG", new File("C:/Downloads/h.png"));
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

LEMBRANDO QUE NO BANCO DECLAREI UMA COLUNA COM BLOB PARA SALVAR A IMAGEM E ESTOU UTILIZANDO HIBERNATE LOGO O MAPEAMENTO DO CAMPO FOTO FICOU ASSIM

@Lob
	@Column(name = "foto")
	public byte[] getFoto() {
		return this.foto;
	}
V

:slight_smile:

L

hvivox, sei que estou abusando mas se puder postar a classe DAO e a entidade, não estou conseguindo fechar e já estou com a cabeça doendo

um abraço

L

A ENTIDADE QUE ESTOU USABDO FICOU ASSIM:

package entidades;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Lob;

import javax.persistence.Persistence;

@Entity
public class Logomarcas implements Serializable {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String nome;

@Lob
@Column(name = "logomarcas")
private byte[] logomarcas;


 public Logomarcas() {
 
}

public byte[] getLogomarcas() {
    return logomarcas;
}

public void setLogomarcas(byte[] logomarcas) {
    this.logomarcas = logomarcas;
}


public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

    public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

 /**
 * Retorna um valor de codigo hash para o objeto.  Esta implementcao computa
 * um valor de c�digo hash baseado nos campos id deste objeto.
 * @return um valor de c�digo hash para este objeto.
 */
@Override
public int hashCode() {
    int hash = 0;
    hash += (this.id != null ? this.id.hashCode() : 0);
    return hash;
}


@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Logomarcas)) {
        return false;
    }
    Logomarcas other = (Logomarcas)object;
    if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
    return true;
}


/**
 * Retorna uma representa��o literal deste objeto.  Esta implementa��o cria
 * uma representa��o baseada nos campos id.
 * @return uma representa��o literal deste objeto.
 */
@Override
public String toString() {
   return "javaapplication9.Imagem[id=" + id + "]";
  //         return logomarcas;
           //return nome;
}

public void persist(Object object) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("GerenciamentoAmbulatorial");
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    try {
        em.persist(object);
        em.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        em.getTransaction().rollback();
    } finally {
        em.close();
    }
}

}

E A DAO
package dao;

import entidades.Logomarcas;

import java.util.List;

import javax.persistence.Query;

import javax.persistence.EntityManager;

import util.Banco;
public class LogomarcasDAO {

//Cria um novo objeto de entidade.

EntityManager em;

//Cria um objeto para fazer as consultas.

Query q;

//Construtor da classe que já instacia os objetos para acesso ao banco.

public LogomarcasDAO() {

//Objeto de entidade recebe um objeto de entidade real do banco, através da classe Banco.

em = Banco.getInsatance().getEntityManager();

//Cria um objeto para manipular as consultas no banco.

q=em.createQuery(FROM Logomarcas cid order by log.nome);

}

//Método que faz consulta ao banco de dados através do ID passado como parâmetro.

public Logomarcas get(Long id){

em.clear();

em.getTransaction().begin();

Logomarcas log =em.find(Logomarcas.class,id);

em.getTransaction().commit();

return log;
}
//Cria uma consulta de Logomarcas , e retorna em uma lista de Logomarcas .
public List<Logomarcas> select(){
    em.clear();
    em.getTransaction().begin();
    
    List lista=em.createQuery("FROM Logomarcas cid order by log.nome").getResultList();
    
    em.getTransaction().commit();
    return lista;
}
//Busca de Logomarcas , passando uma lista de Logomarcas , e um filtro passado como parâmetro. 
public List<Logomarcas> select(String filtro){
    em.clear();
    em.getTransaction().begin();
    
    String hsql;
    hsql = "FROM Logomarcas log";
    hsql += "Where ";
    hsql += "log.nome like :filtro ";
        
    Query query = em.createQuery(hsql);
    query.setParameter("filtro", filtro + "%");
    
    List lista=query.getResultList();
    
    em.getTransaction().commit();
    return lista;
}
//Método para salvar a Logomarcas . Passa Logomarcas como parâmetro.
public void saveOrUpdate(Logomarcas log){
    em.clear();
    em.getTransaction().begin();
    em.merge(log);
    em.getTransaction().commit();
}
//Método para deletar a Logomarcas . Passa Logomarcas como parâmetro.
public void delete(Logomarcas log){
    em.clear();
    em.getTransaction().begin();
    log= em.find(Logomarcas.class,log.getId());
    if (cid!=null){
        em.remove(log);
    }
    em.getTransaction().commit();
}

}

Ah já estava esquecendo a tabela logomarca está ligada a tabela empresa

import java.io.Serializable;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Inheritance;

import javax.persistence.InheritanceType;

import javax.persistence.ManyToOne;

import javax.persistence.OneToOne;
@Entity

@Inheritance(strategy=InheritanceType.JOINED)

public class Empresa implements Serializable {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private Long id;
@ManyToOne
private Logomarcas logomarcas;

public Empresa() {
}

public void setLogomarcas(byte[] logomarcas) {
    this.logomarcas.setLogomarcas(logomarcas);
}

public byte[] getLogomarcas() {
    return logomarcas.getLogomarcas();
}


o netbeans não acusa erro mas o banco (postgres) não aceita o dado
empresas.setLogomarcas(byteArray);

H

Posso ajudar sim posta o erro aqui que te ajudo.

D

hvivox:
ViniGodoy:
Você leu a documentação do método getData() do DataBufferByte?

Ele é bem claro:

Ou seja, ele retorna apenas o primeiro bank da imagem.

Talvez esse post aqui te ajude:
http://intelectolivre.blogspot.com/2008/07/exibindo-gravando-e-recuperando-imagens.html

Vini, mto obrigado graça a sua ajuda consegui resolver o problema.
A solução foram estas

  • PARA SALVAR OU GRAVAR A IMAGEM NO BANCO UTILIZEI ESTES COMANDOS
//Ler a imagem do caminho especificado
			imagem = ImageIO.read(new File("C:/logo.png"));
			//OBTEM A IMAGEM E TRANSFORMA EM BYTES[]
			ByteArrayOutputStream bytesImg = new ByteArrayOutputStream();
			ImageIO.write((BufferedImage)imagem, "jpg", bytesImg);//seta a imagem para bytesImg
			bytesImg.flush();//limpa a variável
			byte[] byteArray = bytesImg.toByteArray();//Converte ByteArrayOutputStream para byte[] 
			bytesImg.close();//fecha a conversão
			
			reg.setId(7);
			reg.setNome("Leomara");
			reg.setFoto(byteArray);
			regDao.salvar(reg);

PARA BUSCAR E EXIBIR A IMAGEM DO BANCO DE DADOS UTILIZEI ESTES COMANADOS

public void exibirFoto(){
		RegistroDao regDao = new RegistroDao();
		Registro reg = new Registro();		
		byte[] foto = null;
		
		//LENDO E COPIANDO IMAGEM ##############################################
		BufferedImage img = null; 
		reg = regDao.findById(7);
								
		try {
			img = ImageIO.read(new ByteArrayInputStream(reg.getFoto()));
			lblFoto.setIcon(new ImageIcon(img));	
			ImageIO.write(img, "PNG", new File("C:/Downloads/h.png"));
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

LEMBRANDO QUE NO BANCO DECLAREI UMA COLUNA COM BLOB PARA SALVAR A IMAGEM E ESTOU UTILIZANDO HIBERNATE LOGO O MAPEAMENTO DO CAMPO FOTO FICOU ASSIM

@Lob
	@Column(name = "foto")
	public byte[] getFoto() {
		return this.foto;
	}

Nó cara Muito obrigado a vc e a vini, consegui fazer.

Criado 24 de outubro de 2010
Ultima resposta 16 de jan. de 2014
Respostas 8
Participantes 4