Problema para salvar a imagem no banco de dados

14 respostas
F

Olá pessoal, ja pesquisei praticamente em todos os fóruns a respeito de salvar imagem no banco, mas infelizmente nao consegui =( to quase desistindo ja, mas resolvi postar aqui pra ver se alguem pode me ajudar. gostaria de converter a imagem em bytes e depois salva-la no banco, porem nao estou conseguindo fazer isso, segue meus codigos:

Esse codigo é para capturar a imagem no desktop do usuario

private void imgMouseClicked(java.awt.event.MouseEvent evt) {
        
          JFileChooser arquivo = new JFileChooser();      
       FileNameExtensionFilter filtro =  new FileNameExtensionFilter("Imagens", "gif", "jpg", "png", "jpeg", "bitmap");
              
         arquivo.setFileFilter(filtro);  
             
           arquivo.setAcceptAllFileFilterUsed(false);
              
             arquivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
                
               File file = new File("user.dir");
               
                   
                 
                int salvar = arquivo.showOpenDialog(null);
                
                 if(salvar == JFileChooser.APPROVE_OPTION){
                     ImageIcon image = new ImageIcon(arquivo.getSelectedFile().getPath());
                       img.setIcon(new ImageIcon(image.getImage().getScaledInstance(img.getWidth(),img.getHeight(),Image.SCALE_DEFAULT)));

O código a seguir é do botao de salvar da imagem:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    
        try{
             Class.forName("com.mysql.jdbc.Driver");
            
             Connection con;
             
              con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/videoaulajdbc", "root", "96512169");
              
              
               String query = "INSERT INTO cadastrousuario (imagem) VALUES (?)";
        
                  PreparedStatement stmt = con.prepareStatement(query);
                  
                   stmt.setBytes(1, imagen);
                   
                    
                    stmt.executeUpdate();
                    
                    
                    
                    
                    stmt.close();
                    con.close();
       
        JOptionPane.showMessageDialog(null,"Cadastrado com sucesso");
      
        
        }catch(ClassNotFoundException ex){
            JOptionPane.showMessageDialog(null,"Não foi possivel encontrar a classe");
        
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro de SQL");
        }

Se alguem puder me ajudar serei eternamente grata =)

obrigada pessoal.

14 Respostas

ViniGodoy

Por favor, ao postar tópicos, não use SOMENTE LETRAS MAIÚSCULAS nos títulos.

Quanto ao seu problema… geralmente é melhor salvar a imagem no sistema de arquivos (com ImageIO.write) e salvar no banco de dados apenas uma String com um link para essa imagem.

Eu também não usaria ImageIcon, mas a classe BufferedImage direto:

BufferedImage bufferedImage = ImageIO.read(arquivo.getSelectedFile());

Se você realmente precisar salvar a imagem no banco, você pode transforma-la num array de Bytes passando para o ImageIO.write um ByteArrayOutputStream:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "png", bos); byte[] imgData = bos.toByteArray();

F

Viny obrigada por responder, mas a nao to conseguindo exibir a classe BuffereImage no meu jlabel, e como faço para passar os bytes para meu banco? Desculpe sou iniciante ainda =/

ViniGodoy

Para exibir no JLabel, vc põe o BufferedImage no ImageIcon:

seuJlabel.setIcon(new ImageIcon(bufferedImage));

O ImageIcon é um objeto de interface gráfica. O BufferedImage é a imagem em si.

F

Vini o BufferedImage deu certo, agora como faço para passar a imagem para o banco?

String query = "INSERT INTO cadastrousuario (imagem) VALUES (?)";
        
                  PreparedStatement stmt = con.prepareStatement(query);
                  
                   stmt.setBytes(1, img);
                   
                    
                    stmt.executeUpdate();
ViniGodoy

Você deve usar o código que já postei:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "png", bos); byte[] imgData = bos.toByteArray(); PreparedStatement stmt = con.prepareStatement(query); stmt.setBytes(1, imgData);

F

poxa, deu erro :(

codigo da imagem no jlabel

if(salvar == JFileChooser.APPROVE_OPTION){
            try {
                BufferedImage bufferedImage = ImageIO.read(arquivo.getSelectedFile());
                img.setIcon(new ImageIcon(bufferedImage));
               
                
            } catch (IOException ex) {
                Logger.getLogger(imagem.class.getName()).log(Level.SEVERE, null, ex);
            }
                
            }

Codigo do botao salvar

try{
             Class.forName("com.mysql.jdbc.Driver");
            
             Connection con;
             
              con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/videoaulajdbc", "root", "96512169");
              
              
               ByteArrayOutputStream bos = new ByteArrayOutputStream();  
            
                ImageIO.write(bufferedImage, "png", bos);  
                 byte[] imgData = bos.toByteArray();  
              
              
               String query = "INSERT INTO cadastrousuario (imagem) VALUES (?)";
        
                  PreparedStatement stmt = con.prepareStatement(query);
                  
                   stmt.setBytes(1, imgData);
                   
                    
                    stmt.executeUpdate();
                    
                    
                    
                    
                    stmt.close();
                    con.close();
       
        JOptionPane.showMessageDialog(null,"Cadastrado com sucesso");
      
        } catch (IOException ex) {
                Logger.getLogger(imagem.class.getName()).log(Level.SEVERE, null, ex);
        }catch(ClassNotFoundException ex){
            JOptionPane.showMessageDialog(null,"Não foi possivel encontrar a classe");
        
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro de SQL");
        }

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
at javax.imageio.ImageIO.write(ImageIO.java:1578)
at testes.imagem.jButton1ActionPerformed(imagem.java:176)
at testes.imagem.access$100(imagem.java:29)
at testes.imagem$2.actionPerformed(imagem.java:80)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

ruben_m

Eu uso o seguinte codigo e funciona direitinho

public void gravarimagem() throws FileNotFoundException, SQLException{ File imagem = new File("foto.jpg"); FileInputStream foto = new FileInputStream(imagem); String sql = "insert into tabela values(NULL,?)"; PreparedStatement stmt = this.conexao.prepareStatement(sql); stmt.setBinaryStream(1, foto, imagem.length()); stmt.execute(); }

F

Ruben, no File vc ja esta definindo a imagem

File imagem = new File("foto.jpg");

e no caso que o usuario que escolhe a imagem, como faz?

F

Meu Deus, to quase a um mes tentando gravar a imagem no banco e nao to conseguindo :frowning:

Vini, pesquisei nos outros topicos e vi q vc entende bem do assunto, tem alguma ideia do q eu estou fazendo de errado?

obrigada.

ruben_m

fany:
Ruben, no File vc ja esta definindo a imagem

File imagem = new File("foto.jpg");

e no caso que o usuario que escolhe a imagem, como faz?

Sim ai passo o endereço da imagem

podes fazer assim também:

File imagem = new File("C:/Users/foto.jpg");

A ideia é voce passar nesse argumento o endereço da imagem

F

humm, coloquei o caminho da imagem, mas mesmo assim deu erro

java.io.FileNotFoundException: C:\foto.jpg (O sistema não pode encontrar o arquivo especificado)

:frowning: :frowning: :frowning: :frowning: :frowning:

ruben_m

fany:
humm, coloquei o caminho da imagem, mas mesmo assim deu erro

java.io.FileNotFoundException: C:\foto.jpg (O sistema não pode encontrar o arquivo especificado)

:frowning: :frowning: :frowning: :frowning: :frowning:

Voce colocou a foto nesse directorio ?

F

sim

F

alguem pra me ajudar?

Criado 3 de agosto de 2012
Ultima resposta 7 de ago. de 2012
Respostas 14
Participantes 3