Salvar imagem no Banco de dados

15 respostas
javaprogramação
C

olá pessoal, eu queria saber como posso salvar a imagem no banco de dados.

Este é o código do modelo

package modelo;

import java.sql.Date;

/**
 *
 * @author Carlos
 */
public class Funcionario {
    private int id_funcionario ;
    private String nome_funcionario;
    private String cpf_funcionario;
    private String rg_funcionario;
    private String email_funcionario;
    private String endereco_funcionario	;
    private String telefone_funcionario;
    private String telefone2_funcionario;
    private int idade_funcionario;
    private Date data_nascimento_funcionario;
    private String sexo_funcionario;
    private String turno;
    private String cargo;
    private double salario;
    private byte[] foto_funcionario;
    private String senha;
    
    
    public int getId_funcionario() {
        return id_funcionario;
    }

    public void setId_funcionario(int id_funcionario) {
        this.id_funcionario = id_funcionario;
    }

    public String getNome_funcionario() {
        return nome_funcionario;
    }

    public void setNome_funcionario(String nome_funcionario) {
        this.nome_funcionario = nome_funcionario;
    }

    public String getCpf_funcionario() {
        return cpf_funcionario;
    }

    public void setCpf_funcionario(String cpf_funcionario) {
        this.cpf_funcionario = cpf_funcionario;
    }

    public String getRg_funcionario() {
        return rg_funcionario;
    }

    public void setRg_funcionario(String rg_funcionario) {
        this.rg_funcionario = rg_funcionario;
    }

    public String getEmail_funcionario() {
        return email_funcionario;
    }

    public void setEmail_funcionario(String email_funcionario) {
        this.email_funcionario = email_funcionario;
    }

    public String getEndereco_funcionario() {
        return endereco_funcionario;
    }

    public void setEndereco_funcionario(String endereco_funcionario) {
        this.endereco_funcionario = endereco_funcionario;
    }

    public String getTelefone_funcionario() {
        return telefone_funcionario;
    }

    public void setTelefone_funcionario(String telefone_funcionario) {
        this.telefone_funcionario = telefone_funcionario;
    }

    public String getTelefone2_funcionario() {
        return telefone2_funcionario;
    }

    public void setTelefone2_funcionario(String telefone2_funcionario) {
        this.telefone2_funcionario = telefone2_funcionario;
    }

    public int getIdade_funcionario() {
        return idade_funcionario;
    }

    public void setIdade_funcionario(int idade_funcionario) {
        this.idade_funcionario = idade_funcionario;
    }

    public Date getData_nascimento_funcionario() {
        return data_nascimento_funcionario;
    }

    public void setData_nascimento_funcionario(Date data_nascimento_funcionario) {
        this.data_nascimento_funcionario = data_nascimento_funcionario;
    }

    public String getSexo_funcionario() {
        return sexo_funcionario;
    }

    public void setSexo_funcionario(String sexo_funcionario) {
        this.sexo_funcionario = sexo_funcionario;
    }

    public String getTurno() {
        return turno;
    }

    public void setTurno(String turno) {
        this.turno = turno;
    }

    public String getCargo() {
        return cargo;
    }

    public void setCargo(String cargo) {
        this.cargo = cargo;
    }

    public double getSalario() {
        return salario;
    }

    public void setSalario(double salario) {
        this.salario = salario;
    }

    public byte[] getFoto_funcionario() {
        return foto_funcionario;
    }

    public void setFoto_funcionario(byte[] foto_funcionario) {
        this.foto_funcionario = foto_funcionario;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }
   
}

Este é a classe DAO, que salva no banco de dados.

package DAO;

import connection.ConnectionFactory;
import java.io.FileInputStream;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import modelo.Funcionario;

/**
 *
 * @author Carlos
 */
public class FuncionarioDAO {
     
    public void salvar(Funcionario f){
        
        Connection con = ConnectionFactory.getConnection();
        PreparedStatement stmt = null;

        try {
            stmt = con.prepareStatement("INSERT INTO funcionario(nome_funcionario,email_funcionario,cpf_funcionario,rg_funcionario,data_nascimento_funcionario,idade_funcionario,telefone_funcionario,telefone2_funcionario,endereco_funcionario,sexo_funcionario,cargo,turno,salario,senha,foto_funcionario)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            stmt.setString(1, f.getNome_funcionario());
            stmt.setString(2, f.getEmail_funcionario());
            stmt.setString(3, f.getCpf_funcionario());
            stmt.setString(4, f.getRg_funcionario());           
            stmt.setDate(5, new java.sql.Date (f.getData_nascimento_funcionario().getTime()));
            stmt.setInt(6, f.getIdade_funcionario());            
            stmt.setString(7, f.getTelefone_funcionario());
            stmt.setString(8, f.getTelefone2_funcionario());
            stmt.setString(9, f.getEndereco_funcionario());
            stmt.setString(10, f.getSexo_funcionario());
            stmt.setString(11, f.getCargo());
            stmt.setString(12, f.getTurno());            
            stmt.setDouble(13, f.getSalario());
            stmt.setString(14, f.getSenha());
            stmt.setBytes(15, f.getFoto_funcionario());
            
            
      stmt.executeUpdate();
            
            JOptionPane.showMessageDialog(null,"Cadastrado com sucesso!");
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Erro ao cadastrar: "+ex);
        }finally{
            ConnectionFactory.closeConnection(con, stmt);
        }
 }

Esse é o código do botão para escolher a foto

JFileChooser jfc = new JFileChooser();
        jfc.setDialogTitle("Selecionar arquivo");
        jfc.setFileFilter(new FileNameExtensionFilter("Arquivo de imagens(*.PNG,*.JPG,*.JPEG)","png","jpg","jpeg"));
        int resultado  = jfc.showOpenDialog(this);
        if (resultado == JFileChooser.APPROVE_OPTION){
            File selectedFile = jfc.getSelectedFile();
            try{
                
                fis = new FileInputStream(jfc.getSelectedFile());
                tamanho = (int) jfc.getSelectedFile().length();
                Image foto = ImageIO.read(jfc.getSelectedFile()).getScaledInstance(lblfoto.getWidth(), lblfoto.getHeight(), Image.SCALE_SMOOTH);
                lblfoto.setIcon(new ImageIcon(foto));
                lblfoto.updateUI();
                
                 byte[] fileData = new byte[(int) selectedFile.length()];
                 try (FileInputStream fis = new FileInputStream(selectedFile)) {
                    fis.read(fileData);
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }

E este é o botão salvar

Funcionario f = new Funcionario();
        FuncionarioDAO dao = new FuncionarioDAO();

        f.setNome_funcionario(nome.getText());
        f.setCpf_funcionario(CPF.getText());
        f.setRg_funcionario(RG.getText());
        f.setEmail_funcionario(email.getText());
        f.setEndereco_funcionario(end.getText());
        f.setTelefone_funcionario(cel.getText());
        f.setTelefone2_funcionario(tel.getText());
        f.setData_nascimento_funcionario(new java.sql.Date(data.getDate().getTime()));
        f.setIdade_funcionario(Integer.parseInt(ida.getText()));
        f.setSexo_funcionario(sexo.getSelectedItem().toString());
        f.setCargo(car.getSelectedItem().toString());
        f.setTurno(tur.getSelectedItem().toString());
        f.setSalario(Double.parseDouble(sala.getText()));
        f.setSenha(sen.getText());                
        f.setFoto_funcionario(fileData);
        dao.salvar(f);

        limpar();

        readJTable();

O problema que eu to tendo, o fileData não esta sendo reconhecido f.setFoto_funcionario(fileData); , fazendo com que não salve no banco de dados.

Poderiam me ajudar nisso?

15 Respostas

L

Como assim não está sendo reconhecido? Está vindo null?

C

fica assim, comparado aos outros

L

E quando vc passa o mouse sobre essa linha vermelha de erro, qual erro está aparecendo?

P

O fileData está a ser declarado dentro de um try. O scope dele é restrito a esse try.
Onde estás a tentar utilizador depois, já “não existe”…

C

fala para criar uma variavel local chamada fileData ou um campo chamando fileData no GUI.funcionario

C

então como eu posso fazer para que ele não seja restrito?

L

Declare a variável fileData fora do try e dentro do try apenas faça a atribuição do valor.

C

agora ele reconheceu, mas não está salvando no banco de dados a foto

L

A variável está vindo preenchida? Está ocorrendo algum erro? Qual o tipo de dado que vc usou para a coluna no banco de dados?

C

não esta ocorrendo nenhum erro.
O tipo de dado esta como Blob.
Como assim a variável tá vindo preenchida?

L

Se por acaso a fileData data esteja vindo null por alguma razão.

C

quando eu aperto no botão salvar, aperece a mensagem que eu coloquei quando salvar o funcionário, mas quando vejo o banco de dados o campo da foto está vazio.

L

Veja se depois da execução dessa parte:

try (FileInputStream fis = new FileInputStream(selectedFile)) {
  fis.read(fileData);
}

a variável fileData está preenchida ou null.

C

a variável que vc diz, é o label que vai ser preenchido pela imagem? pq se for ele preenche normalmente

L

A variável que falo é a fileData, que vc estava preenchendo assim:

byte[] fileData = new byte[(int) selectedFile.length()];
try (FileInputStream fis = new FileInputStream(selectedFile)) {
  fis.read(fileData);
}
Criado 7 de setembro de 2023
Ultima resposta 9 de set. de 2023
Respostas 15
Participantes 3