Não consigo exibir imagem retornada do BD como array de bytes

1 resposta
walterfelipe

Oie pessoal, tou com problemas pra exibir em um JInternalFrame uma imagem que retorno do meu banco de dados.Consigo carregar ela na tela quando alimento via caminho da imagem no meu disco mas quando construo um objeto do tipo Image e tento setar para um Label no JInternalFrame a coisa não funciona. vou postar os códigos da busca onde eu retorno o objeto e esse atributo que é vem como um array de bytes.

Aqui retorno do banco
conexao = new Conexao();
			conexao.setAutoCommit(false);
			sql = "select Codigo,Autor, Editora, Edicao, Numero, Duracao, Image, Formato From  Multimidia_Tab where Numero= ?"; 
						
		      // prepare blob object from an existing binary column
			
		      pstmt = conexao.getConexao().prepareStatement(sql);
		      pstmt.setInt(1,numero);
		      ResultSet rs = pstmt.executeQuery();
		      
		      if(rs.next()){
		    	  
		    	
		    	  
		    	  multimidia = new Multimidia(rs.getInt(1),
		    			                      rs.getString(2),
		    			                      rs.getString(3),
		    			                      rs.getString(4),
		    			                      rs.getInt(5),
		    			                      rs.getString(6),
		    			                      rs.getString(8),
		    			                      rs.getBytes(7));

mando preencher os campos de tela com o objeto recuperado

preencheCampos(multimidia);

o meu preenche campos alimenta os objetos na tela e carrega o JInternalFrame com uma imagem vinda no objeto e recuperada do banco

/**metodo que carrega na tela os dados da multimidia
	 * 
	 * @param multimidia
	 */
	
	private void preencheCampos(Multimidia multimidia){
		
		setNumero(multimidia.getNumero());
		setCodigo(multimidia.getCodigo());
		setAutor(multimidia.getAutor());
		setEdicao(multimidia.getEdicao());
		setEditora(multimidia.getEditora());
		setDuracao(multimidia.getDuracao());
		setFormato(multimidia.getFormato());
		carregaImagem(Util.retornaImagemFromByteArray(multimidia.getImagem()));
		
	}
public static Image retornaImagemFromByteArray(byte[] arrayByte){
		
		Image image = null;		
		try {					
			image  = Toolkit.getDefaultToolkit().createImage(arrayByte);
		} catch (RuntimeException e) {
			
			System.out.println("Util::retornaImagemFromByteArray::"+e);
		}			
		
		return image;
	}
private void carregaImagem(Image imagem) {
	Image image = imagem;
	String pathImagem = null;

	if(image == null) {
		pathImagem = Util.retornaArquivoSelecionado().getAbsolutePath();
		if (pathImagem != null) {
			image = Toolkit.getDefaultToolkit().getImage(pathImagem);
			pathImagemLocal = pathImagem;
		}
	}
	
	if(image != null){
	
		ImageIcon icon = new ImageIcon(image);
		JLabel label = null;
		label = new JLabel(icon);
		label.setSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
		jInternalFrameImagem.setDefaultCloseOperation(jInternalFrameImagem.DISPOSE_ON_CLOSE);
		jInternalFrameImagem.setMaximizable(true);
		jInternalFrameImagem.setVisible(false);
		jInternalFrameImagem.getContentPane().removeAll();
		jInternalFrameImagem.getContentPane().repaint();
		jInternalFrameImagem.setBounds(0, 0, label.getWidth(),label.getHeight());
		jInternalFrameImagem.getContentPane().add(label);
		jInternalFrameImagem.validate();
		jInternalFrameImagem.repaint();
		jInternalFrameImagem.setVisible(true);      
		
	}

	
	
}

Quando informo a imagem vinda do disco tudo ok, mostra legal, porém vindo do banco tá se quebrando. Peço ajuda pois ão tou conseguindo achar solução. Obs : Criar um arquivo no disco com os bytes vindos do banco e depois jogar na tela não é uma solução :( O professor não vai aceitar.

1 Resposta

walterfelipe
Resposta:

ResultSet rs = pstmt.executeQuery();

java.sql.Blob blob = rs.getBlob(7));

byte[] array = blob.getBytes(1, (int) blob.length());

O problema era que o array de bytes inserido no banco estava correto, mas o retorno dele através do rs.getBytes() vinha com tamanho diferente do array de bytes inserido. Quando eu recupero com rs.geBlob vem com o tamanho certo. então é só extrair o array de bytes do blob e gerar a imagem.

Criado 23 de junho de 2008
Ultima resposta 23 de jun. de 2008
Respostas 1
Participantes 1