Inserção de imagem em banco de dados via desktop

7 respostas
palilo

Opa

meu problema é o seguinte:

minha aplicação é desktop, dai eu primeiro exibo a imagem que o usuário escolheu transformando-a em um icon e usando o método setIcon do JLabel, depois eu preciso inserir essa imagem no banco.

O problema é que eu só tenho acesso ao JLabel, e conseqüentemente ao icon que representa a imagem, o problema é, como transformar esse icon em um binário para poder inserir em um campo blob???

vlw

t+

7 Respostas

ramilani12

Vc pode realizar dessa maneira:

//Busca imagem

public byte[] pegaImagem(int idImagem)
{

Statement stmt = con.createStatement();
            
            ResultSet rs = stmt.executeQuery("select capa from livros where livro_id = "+idImagem);
            InputStream leitura;
            ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
            if (rs.next()) 
            {
                leitura = rs.getBinaryStream(1);
                int lido = 0;
                lido = leitura.read();
                while (lido != -1) {
                    buffer.write(lido);
                    lido = leitura.read();
                }
            }

return buffer.toByteArray();
}

O método acima busca a imagem no banco de dados e adiciona em um array de bytes e retorna esse Array

Esse código abaixo é para aplicar a imagem no JLabel precisamos Utilizar a Interface Icon quem implementa a Interface Icon é ImageIcon em uns dos seus construtores há um passagem de um array de bytes e descrição da Imagem

Obs: a ImagemIcon só aceita JPG ou GIF

// Mostrando a Imagem 

byte [] i = pegaImagem(int idImagem);
Icon imagem = new ImagemIcon( i , "Nome Imagem");

JLabel label = new JLabel(imagem);

Agora para inserir a imagem:
Devemos pegar a imagem e transforma-la para um array de bytes

PreparedStatement pstmt = con.prepareStatement("seu insert");
File file = new File("Caminho da Imagem");
FileInputStream inputImage = new FileInputStream(file);
pstmt.setBinaryStream(1, inputImage, (int)(file.length()));
pstmt.executeUpdate();
palilo

Opa,

entao cara, dessa forma da certo sim, o problema é que no caso que eu estou eu quero pegar uma imagem que esta sendo exibida pelo JLabel e armazena-la no banco, isto é sem usar o endereço da imagem…

mas vou tentar adptar o meu problema para pegar o endereço da imagem que dai funciona, mas se alguem souber como faz do outro jeito e puder me dizer eu tambem agradeço valeu

t+

fabim

um objeto ImageIcon tem um metodo getImage(), que te devolve um Image (é claro)…

de posse desse objeto Image, dá uma olhada nesses 2 métodos aqui:

// Transforma um Image pra BufferedImage
public static BufferedImage ImageToBuffered(Image im) {
		
		BufferedImage bi = new BufferedImage(
			im.getWidth(null), im.getHeight(null), BufferedImage.TYPE_INT_RGB);
		Graphics bg = bi.getGraphics();
		bg.drawImage(im, 0, 0, null);
		bg.dispose();
		
		return bi;
		
	}

//Transforma um BufferedImage pra um array de bytes
public static byte[] bufferToBytes( BufferedImage buffer, String formatName ) throws Exception {
		
		byte[] bytes = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();;
		
		try {
			
			if ( buffer != null)
				ImageIO.write(buffer, formatName, baos);
			
		} catch (IOException e) {
			
			baos = null;
			throw e;
			
		} finally {
		
			if ( baos != null )
				bytes =  baos.toByteArray();
		
		}
		
		return bytes;
		
	}

Tendo os bytes na mao, é facil inserir no banco :wink:

PreparedStatement stmt = new PreparedStatement( seuSql );

sql.setBytes( 1, bytes );

palilo

ae fera,

é bem isso mesmo que eu preciso, a noite vou testar em casa e dai posto se deu certo…

vlw pela ajuda

palilo

opa, deu certo

mas eu fiz uma gambiarra para funcionar… tive que criar a variavel File como global, o que eu tenho quase certeza de que nao é o mais indicado…

estou anexando o projeto do netbeans com o codigo para o caso de alguem quiser dar uma analisada.

é uma aplicação que serve para buscar uma imagem no banco de dados, buscar uma imagem no computador e gravar uma imagem no banco (essa parte eu fiz), é só um exemplo que eu estou usando para estudar, nada demais… essa aplicação foi montada no modelo mvc, mas eu ainda nao consegui compreender completamente esse modelo, um deles é como é feita a ligação entre as classes de visao com a de controle, e tambem se a forma que foi feita para tratar dos eventos é a utilizada realmente…

outra coisa na execução do sistema ele nao exibe a imagem quando vc busca ela do banco, mas aparentemente esta tudo correto

é isso desculpa o incomodo, mas to muito fraco ainda hehe

t+

palilo

alguem?

t+

guilherme.chapiewski

Casualmente saiu na revista Java Magazine numero 44 uma reportagem que tinha como exemplo um programa parecido com o que você está querendo desenvolver. O código fonte dele pode ser baixado em http://www.devmedia.com.br/javamagazine/download.asp e o nome da matéria era JDBC Blobs.

Criado 28 de maio de 2007
Ultima resposta 5 de jun. de 2007
Respostas 7
Participantes 4