Problema imagem no formato de array de bytes?

4 respostas Resolvido
arraybytesimages
J

Estou com um problema a um tempão, tenho uma imgem em um array de bytes comum até ae beleza, seto no banco, porem quando volta não mostra nada como se fosse inútil armazenar foto.

No Banco quando pesquisa fica assim: [B@430a540. Aqui é a parte legal do projeto que pega bem, onde eu vou inserir, com a variavel buffer:

FileNameExtensionFilter filtro = new FileNameExtensionFilter("*.jpg", "jpg");
chooser.setFileFilter(filtro);

int resposta = chooser.showOpenDialog(new JDialog());

File file = new File("");


if(resposta == JFileChooser.APPROVE_OPTION){
	file = chooser.getSelectedFile();
	
	String foto = file.getPath();
	Foto.setText(foto);
	
	textPane.insertIcon(new ImageIcon(Foto.getText()));
	//ImageIcon image = new ImageIcon(Foto.getText());
	
	byte[] buffer = new byte[(int) file.length()];
	InputStream ios = null;
	try {
		ios = new FileInputStream(file);
		if (ios.read(buffer) == -1) {
			throw new IOException("EOF reached while trying to read the whole file");
		}
			if (ios != null){
				ios.close(); 
			}
		}catch (IOException er) {
			JOptionPane.showMessageDialog(null, "erro de buffer");
		}
	me.setFoto(buffer);
}else if(resposta == JFileChooser.CANCEL_OPTION){
}

Aqui eu criei uma outra classe para pegar a imagem do banco

byte[] cid = null;
try{
	
	Statement stm = conn.createStatement();
	ResultSet res = stm.executeQuery("select foto_mercado from mercado where idmercado = 21");
	

	while (res.next()) {
		cid=res.getBytes(1);
	}

	} catch (SQLException e1) {
		JOptionPane.showMessageDialog(null, "erro foto");
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
if(cid!=null){
	InputStream input = new ByteArrayInputStream(cid);
		try{
			BufferedImage imagem = ImageIO.read(input);
			JOptionPane.showMessageDialog(null, imagem);
			textPane.insertIcon(new ImageIcon(imagem));
		}catch(IOException ex){
			JOptionPane.showMessageDialog(null, "erro");
		}
}

4 Respostas

J

Qual o banco e o tipo do campo que você colocou na sua tabela?
Cara se for blob, tenta no teu resultset pegar dessa forma

Blob blob = rs.getBlob("photo");      
  byte[] foto = blob.getBytes(1, (int) blob.length());
J

Opa, o banco é o postgres o tipo de dado é o bytea. Infelizmente ele é incompatível com o blob.

J
Solucao aceita

coloca o tipo como bytea na tabela e segue o exemplo do site do postgresql , esse exemplo do site abaixo é tanto para read ou write, eu te aconselho a não fazer do jeito que você estava fazendo, então segue a forma correta de leitura e escrita;

https://jdbc.postgresql.org/documentation/80/binary-data.html

J

Nossa cara ajudou muito mesmo obrigado. Vi muita gente com esse problema a unica coisa de errado que é desnecessario o uso de buffer de bytes para enviar ao banco. Durou tres meses esse problema. obrigado mesmo.

Criado 3 de julho de 2016
Ultima resposta 11 de jul. de 2016
Respostas 4
Participantes 2