Receber Valor Blob do Banco para JAVA ImageIcon [RESOLVIDO]

10 respostas
V
estou com um problema, criei um campo Img Blob no meu Mysql e na minha classe cadastrar do Java adicionei os dados e uma variavel CadImg do tipo Image, segue o código
public class Cadastrar extends javax.swing.JFrame {
    Image CadImg;

    public Cadastrar() {
        initComponents();
    } ..
e seleciono a Imagem através do JFileChooser, segue o código
FileNameExtensionFilter filtro = new FileNameExtensionFilter("Arquivo de Imagem (*.jgp, *.gif, *.png, *.jpeg, *.bmp)","jpg", "gif", "png", "jpeg", "bmp");
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(filtro); 
                
        int retorno = fileChooser.showOpenDialog(null); // showSaveDialog retorna um inteiro , e ele ira determinar que o chooser será para salvar.
        if (retorno == JFileChooser.APPROVE_OPTION) {
            try {

            CadImg = ImageIO.read(fileChooser.getSelectedFile());
            JOptionPane.showMessageDialog(this, "Imagem Adicionada!");
             
            } catch(IOException ex ){
              JOptionPane.showMessageDialog(null,"Nao foi possivel abrir! Erro de Formato");
            }   
        } else {
            
        }
e na Classe Consultar, que é em formulário JFrame assim como a classe Cadastrar não consigo receber o valor em blob, segue o código
try { //tratamento de erros
        Class.forName("com.mysql.jdbc.Driver");//busca Driver
    //conecta no BD
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ume", "root", "");
        Statement stmt = con.createStatement();//objeto comdo sql
        
        String ConsCpf = jTextField1.getText();
        ResultSet RS = stmt.executeQuery("Select * from TabFicha where Cpf='" + ConsCpf + "' ");
        while (RS.next()) {
                
              JFrame frame = new JFrame("Foto");
              ImageIcon image = new ImageIcon(RS.getURL("Img"));   //Ja tentei RS.getBlob(); mas não aceita esse método, o problema está por aqui
              JLabel label = new JLabel(image);
              frame.getContentPane().add(label, BorderLayout.CENTER);
              frame.setSize(350,400);
              label.setIcon(new ImageIcon(image.getImage().getScaledInstance(frame.getWidth(),frame.getHeight(), Image.SCALE_DEFAULT)));
              frame.setLocationRelativeTo(null);
              frame.setResizable(false);
              frame.setVisible(true);

            
        }
        RS.close();
        stmt.close();
        con.close(); //fecha conexão com BD
    }  catch (SQLException e) { //trata os erros
        JOptionPane.showMessageDialog(this, "Não Tem Foto Cadastrada.");
    } catch (ClassNotFoundException e) {
        JOptionPane.showMessageDialog(this, "Driver não encontrado");
    }

Alguma ideia ? Me ajudem por favor. Obrigado

10 Respostas

D

cara,
no teu primeiro code aí


vc tem:

CadImg = ImageIO.read(fileChooser.getSelectedFile());

isso aí é uma variavel?
vc criou uma variavel com a primeira letra em maiusculo??

bom… onde eu trabalhava eles salvavam a pasta em um local, e
pegavam apenas o path da imagem (salvava como string)
nao existe essa possibilidade?

cara, no teu codigo vc ta misturando mto gui, com logica, com banco de dados…
estudar algum padrão de projeto seria legal viu…

tipo MVC (pra desktop fica feio, mas msmo assim… kkkk)…
faz uns DAOs também…

e outra dica: USE JPA/HIBERNATE

abraço

V

não, porque tem a possibilidade de computadores da rede precisarem consultar a imagem ai preciso jogá-la no bd.
Alguém tem alguma idéia ?

valeu

D

viniciusme:
não, porque tem a possibilidade de computadores da rede precisarem consultar a imagem ai preciso jogá-la no bd.
Alguém tem alguma idéia ?

valeu

então cara,
mas se alguém precisar consultar a imagem, vc
pega do servidor, carregar os Bytes e manda pela rede!!

pronto

V

ah tá, mas e se por exemplo, eu mudar de pasta a imagem ? não tem problema ? tipo ela vai pro banco como string não é ?
então como faço pra salvar ela no banco ? normal como string ?
e pra consultar ?

D

viniciusme:
ah tá, mas e se por exemplo, eu mudar de pasta a imagem ? não tem problema ? tipo ela vai pro banco como string não é ?
então como faço pra salvar ela no banco ? normal como string ?
e pra consultar ?

faz melhor então, não salve o path completo…
faça um esquema tipo

/upload/usuario/imagem

melhor ainda…
assim cada usuario terá apenas 1 mensagem salva no servidor… se mudar, sobreescreve…

aí o Path fica o q vc configurar na aplicação

V

e como eu faço isso ? tanto na classe de cadastro como na classe de consulta ?

D

Uai… primeiro é estabelecer qual path vc vai guardar as imagens.

Depois colocar um campo no usuario String foto… algo do tipo :slight_smile:

na hora de carregar:

verificar se o campo nao esta null ou inválido (arquivo nao existe)… Caso isso aconteça,
coloque um avatar default :slight_smile:

carregar o arquivo no java… os bytes e faz o que vc faria se estivesse guardado direto no BD.

na hora de salvar:
salva o arquivo no diretorio correto

abraços

V

então, acho que é mais simples jogar a imagem pro banco e consultar, só queria saber como converto pra cadastrar no banco e qual método uso pra consultar.

valeu

D

viniciusme:
então, acho que é mais simples jogar a imagem pro banco e consultar, só queria saber como converto pra cadastrar no banco e qual método uso pra consultar.

valeu

bom… neste caso: Clique aqui!

V

obrigado, resolvi.

eu recebi a imagem como file e a enviei ao banco em bytes
e a classe de consulta estava correta.

Criado 4 de setembro de 2012
Ultima resposta 11 de set. de 2012
Respostas 10
Participantes 2