Olá,
Estou como seguinte problema, tenho uma imagem armazenada no banco de dados(MySQL) gostaria de carregar ela direto em um JLabel sem precisar armazenar a imagem em um TEMP pra depois carregar.
Sempre aprendi que é uma péssima prática de programação armazenar imagens em BD.
O que devemos fazer é colocar as imagens em um diretorio e, no BD, colocar uma variavel com o caminho completo desta imagem. Lá na aplicação basta chamar esta variavel e, pelo caminho, carregar a imagem.
Se estiver errado, por favor me corrijam …
Vimieiro
A
amgarcia
Sim vimieiro, mas é que no meu caso estou trabalhando com EJB seria inviável o cliente
ter que baixar todas as imagens, pois qualquer máquina na rede poderia acessar a
aplicação.
Você concorda comigo?
D
davidbuzatto
Fiz correndo aqui, não testei, mas o caminho é mais ou menos esse.
SerialBlob blob = new SerialBlob( seuStatement.getBlob( "coluna" ) );
BufferedInputStream stream = new BufferedInputStream( blob.getBinaryStream() );
byte[] dados = new byte[ stream.avaliable() ];
stream.read( dados, 0, dados.length );
seuLabel.setIcon( new ImageIcon( dados ) );
Até mais!
A
amgarcia
Valeu davidbuzatto,
Uma outra maneira é essa:
StringOut=null;Stringc=null;Imageimg=null;try{
ConnectionConn=getConnection();StatementStmt=Conn.createStatement();ResultSetRs=Stmt.executeQuery("select Imagem from tblimagem WHERE IDImagem=9;");if(Rs.next()){
img=Toolkit.getDefaultToolkit().createImage(Rs.getBytes(1));}
Conn.close();Stmt.close();System.out.println("Imagem= "+img);jLabel1.setIcon(newjavax.swing.ImageIcon(img));}catch(Exceptionex){
ex.printStackTrace();}
D
davidbuzatto
Talvez vc precise melhorar a leitura dos dados se vc tiver imagens muito grandes… As vezes o buffer é iniciado com uma capacidade menor do que o tamanho total da imagem.
Tente usar o DataInputStream, as vezes o resultado é melhor e tem como vc ir mandando ele ler os bytes usando o método readByte().
Até mais!
D
davidbuzatto
amgarcia:
Valeu davidbuzatto,
Uma outra maneira é essa:
StringOut=null;Stringc=null;Imageimg=null;try{
ConnectionConn=getConnection();StatementStmt=Conn.createStatement();ResultSetRs=Stmt.executeQuery("select Imagem from tblimagem WHERE IDImagem=9;");if(Rs.next()){
img=Toolkit.getDefaultToolkit().createImage(Rs.getBytes(1));}
Conn.close();Stmt.close();System.out.println("Imagem= "+img);jLabel1.setIcon(newjavax.swing.ImageIcon(img));}catch(Exceptionex){
ex.printStackTrace();}
É verdade
Abraço!
A
amgarcia
davidbuzatto:
Talvez vc precise melhorar a leitura dos dados se vc tiver imagens muito grandes… As vezes o buffer é iniciado com uma capacidade menor do que o tamanho total da imagem.
Tente usar o DataInputStream, as vezes o resultado é melhor e tem como vc ir mandando ele ler os bytes usando o método readByte().