Olá a todos!
Estou tentando colocar uma imagem no bd MySql. Pelo muito que li, tenho que transformar a imagem em um array de byte, até achei um exemplo de como fazer essa conversão, o problema é que desse modo, eu precisaria indicar o path da imagem (local). A questão é: O usuario localiza a imagem (FileChooser) e ela é adicionada a um label ( é para dar o efeito de preview) que tem o tamanho fixo, a imagem é redimensionada para o tamanho do label. Na hora de salvar, a imagem deve ser salva sem a necessidade de ele localizar novamente, ou seja, a partir do ImageIcon que adicionei ao label, e deve ser salva no tamanho que defini. Vi também que tem que criar um campo blob, ja criei. Como fazer isso? É mais fácil para recuperar a imagem? Como fazer também?
Agradeço a todos. :thumbup: :thumbup: :thumbup:
Para facilitar…
package img;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;
import javax.swing.JFrame;
import javax.swing.JLabel;
import com.sun.xml.internal.org.jvnet.staxex.Base64Data;
public class Teste extends JFrame{
{
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {
e.printStackTrace();
}
}
private JButton btAbrir;
private JLabel lbFoto;
private JButton btSalvar;
private JPanel paBotoes;
public static ImageIcon icon;
public static void main(String[] args) {
Teste t = new Teste();
t.setVisible(true);
}
public Teste()
{
setBounds(0,0,500,500);
setLocationRelativeTo(null);
setResizable(false);
GridBagLayout thisLayout = new GridBagLayout();
setTitle("Inserir imagem no Banco");
thisLayout.rowWeights = new double[] {0.0, 0.1, 0.0, 0.1};
thisLayout.rowHeights = new int[] {18, 7, 358, 7};
thisLayout.columnWeights = new double[] {0.0, 0.0, 0.0, 0.1};
thisLayout.columnWidths = new int[] {16, 104, 356, 7};
getContentPane().setLayout(thisLayout);
{
lbFoto = new JLabel();
getContentPane().add(lbFoto, new GridBagConstraints(1, 1, 2, 2, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
lbFoto.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(0,0,0)));
//lbFoto.setText("|");
}
{
paBotoes = new JPanel();
FlowLayout paBotoesLayout = new FlowLayout();
paBotoesLayout.setVgap(30);
paBotoes.setLayout(paBotoesLayout);
getContentPane().add(paBotoes, new GridBagConstraints(0, 3, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
paBotoes.setOpaque(false);
{
btAbrir = new JButton();
paBotoes.add(btAbrir);
btAbrir.setText("Abrir imagem");
}
{
btSalvar = new JButton();
paBotoes.add(btSalvar);
btSalvar.setText("Salvar Imagem");
btSalvar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try{
byte[] fileBlob;
java.io.File f1;
java.io.FileInputStream fis;
int fileLength = 0;
f1 = new java.io.File("/home/gustavo/Desktop/impressora.png");
fis = new java.io.FileInputStream(f1);
fileLength = (int)f1.length() + 1;
fileBlob = new byte[fileLength];
fis.read(fileBlob);
fis.close();
if (BD.getConnectionAccess())
{
String sql = "insert into img values('"+fileBlob+"')";
BD.runSQL(sql);
BD.close();
}
}
catch(Exception ex){ex.printStackTrace();}
}
});
}
}
btAbrir.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
boolean imagemValida = false;
String arquivo;
while(imagemValida==false)
{
try
{
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Localizar imagem");
int a = fileChooser.showOpenDialog(null);
// Se a for igual a zero e porque o usuario clicou em salvar, se for 1 e porque clicou em cancelar
if (a==0)
{
//[460, 367]
arquivo = fileChooser.getSelectedFile().getAbsolutePath();// Aqui estou pegando o nome do arquivo e o endereco dele
System.out.println(arquivo);//Imprimindo o caminho e o nome do arquivo
File f = new File(arquivo);
BufferedImage src = ImageIO.read(f);
BufferedImage dest = new BufferedImage(460,367,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = dest.createGraphics();
AffineTransform at = AffineTransform.getScaleInstance(
(double)460/src.getWidth(),
(double)367/src.getHeight());
g.drawRenderedImage(src,at);
//dest agora tem 460x367 pixels e com a imagem redimensionada.
//ImageIcon icon = new javax.swing.ImageIcon(arquivo);
icon = new javax.swing.ImageIcon(dest);
System.out.println("Comprimento da imagem: "+icon.getIconWidth()+"\nAltura da imagem: "+icon.getIconHeight());
imagemValida = true;
lbFoto.setIcon(icon);
}
else
imagemValida = true;
}
catch(Exception ex)
{
JOptionPane.showMessageDialog(null, "Este arquivo n\u00E3o \u00E9 uma imagem v\u00E1lida", "Erro", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}
}
});
}
}
o banco chama imagens e tem só uma tabela chamda img com um campo blob chamado imagem.
uso essa classe genérica para conexões( não consigo ficar sem ela :lol: :lol: :lol:) :
package img;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class BD {
public static Connection connection = null;
public static Statement statement = null;
public static ResultSet resultSet = null;
public static String banco;
//public static String host;
//public static Connection conn = null;
public static boolean status;
public static void main(String args[]) {
getConnectionAccess();
close();
}
/**
* metodo que faz conexao com o banco de dados MySql
* retorna true se houver sucesso, ou false em caso negativo
*/
public static boolean getConnectionAccess() {
status = false;
banco=("jdbc:mysql://localhost/imagens?user=root&password=123");
try {
Class.forName("com.mysql.jdbc.Driver");
connection= DriverManager.getConnection( banco );
status=true;
System.out.println("++CONECTOU");
} catch(ClassNotFoundException e) {
System.out.println("excessão Classe não encontrada");
e.printStackTrace();
} catch(SQLException e) {
System.out.println("SQL Exception... Não conectado");
e.printStackTrace();
}
return status;
}
/**
* Fecha ResultSet, Statement e Connection
*/
public static void close() {
try {
connection.close();
status=false;
System.out.println("++DESCONECTOU");
} catch(SQLException erro) {
System.out.println("Erro no fechamento");
//erro.printStackTrace();
}
}
/**
* Carrega o resultSet com o resultado do script SQL
*/
public static void setResultSet(String sql) {
try {
statement= connection.createStatement();
resultSet= statement.executeQuery(sql);
status = true;
} catch(SQLException e) {
status = false;
System.out.print("Erro ao executar Query!");
e.printStackTrace();
}
}
/**
* Executa um script SQL de atualizacao
* retorna um valor inteiro contendo a quantidade de linhas afetadas
*/
public static int runSQL(String sql) {
int quant = 0;
try {
statement= connection.createStatement();
quant = statement.executeUpdate(sql);
} catch(SQLException erro) {
erro.printStackTrace();
}
return quant;
}
}
Obrigado à todos! :thumbup: :thumbup: :thumbup: