Hola, recientemente un compañero de Vicux, me preguntó como podía hacer para guardar una imagen en MySql, además de otros lectores que están interesados en guardar la imagen que capturan desde la webcam.
En esta oportunidad colocaré el código para realizar dicha faena.
Requisitos:
– MySql
– Una tabla en la Base de Datos que tenga un Campo de tipo LONGBLOB.
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Blob; import java.sql.PreparedStatement; import java.sql.SQLException;
public void guardaImagen(String ruta) throws SQLException, FileNotFoundException { String sql = "INSERT INTO imagen(Imagen) VALUES (?)"; //Creamos una cadena para después prepararla PreparedStatement stmt = conexion.prepareStatement(sql); File imagen = new File(ruta); //ruta puede ser: "/home/cmop/Desktop/1.jpg" FileInputStream fis = new FileInputStream(imagen); //Lo convertimos en un Stream stmt.setBinaryStream(1, fis, (int) imagen.length()); //Asignamos el Stream al Statement stmt.execute(); }
La clave para realizarlos está en la asignación del Stream.
Bueno espero haber contestado a los lectores y a mi compañero Vicuxero albeferz.
Saludos a todos.
Muy bueno, de mucha ayuda
Gracias!!! =)
una cosita mas…
como se puede guardar directamente la imagen obtenida de la WebCam sin tener que primero almacenarla en el ordenador y luego subirla a la Base de Datos?
Muchas gracias!!
un saludo
Hola acabo de actualizar el post https://cmop17.wordpress.com/2010/01/14/jmf-usando-la-webcam-desde-java-y-guardando-una-imagen/ alli puedes como puedes hacer para guardar directamente en la Base de datos la imagen.
saludos.
muchas gracias!!! 😉
grax por el aporte
pero tengo una duda
q que te refieres con:
conexion.prepareStatement(sql);
porque es la unica linea que me marca error
El prepare statement sirve para colocar una cadena con parametros asi » ? «, para luego poderlos asignar como objetos.
ejemplo.setInt(0,OBJETO);
saludos, ademas que esto impide las inyecciones sql.
Como puedo recibirlo desde un formulario html/jsp asi como los demas datos string request.getParameter() y luego enviarlo al método ????????
Debes usar objetos multipart, en jsp.
saludos
cuando dices multipart supongo que es el tipo de datos q envio desde el form osea el atributo enctype «multipart/form-data pero amigo como ago con el campo del input file al recibirlo enmi jsp?
nose si sea mucho pedir podrias poner algun ejemplo aplicado a una jsp guardando la imagen soy novato en esto de jsp java y es para mi proyecto d java
es igual como los demas input que se reciben con el request.getParameter() o tiene algun tratamiento diferente ese tipo de control de formulario por ser un input file?
como le pongo ese codigo a un boton? gracias ññ
que diferencia hay entre el tipo de dato blob y longblog ‘?? me imagino el tamaño y tambien pudieran publicar este ejemplo aplicandolo con un servlet/jsp soy novato en java pero me gustaria aprenderlo
Si pues el tamaño, esto dice la documentacion de mysl.
BLOB, TEXT L + 2 bytes, where L < 216
MEDIUMBLOB, MEDIUMTEXT L + 3 bytes, where L < 224
LONGBLOB, LONGTEXT L + 4 bytes, where L < 232
Saludos
saludos amigo tengo este codigo y me da erro cuando intento guardar en la BD mysql me puede ayudar
// Image Image = img;
String formato = «JPEG»;
if(img !=null)
try
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write((RenderedImage) img, formato, out);
InputStream in = new ByteArrayInputStream(out.toByteArray());
String sql = «INSERT INTO foto_empleados VALUES (?)»;
PreparedStatement ps = mdbc.getMiConexion().prepareStatement(sql);
ps.setBinaryStream(1, input);
//ps.setBinaryStream(2,in,(int)file1.length());
System.out.println(in);
ps.execute();
ps.close();
} catch (SQLException ex) {
// mensajero.mensajeError(null, «Error Al ejecutar sentencia SQL»);
javax.swing.JOptionPane mensaje = new javax.swing.JOptionPane();
mensaje.showMessageDialog(this,»Error Al ejecutar sentencia SQL»,»!!.Atención..!!»,JOptionPane.ERROR_MESSAGE);
} catch (IOException ex) {
// mensajero.mensajeError(null, «Error de Entrada/Salida»);
}
cual es el error??
Exception in thread «AWT-EventQueue-0» java.lang.AbstractMethodError: org.postgresql.jdbc3.Jdbc3PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
Exception in thread «AWT-EventQueue-0» java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
intenta con ps.executeUpdate(); tal vez sea eso, no tengo la certeza ya que soy nuevo programando en Java
tengo una inquietud si deseo que desde el index tome una imagen como hago para convertirla en bytes y agregarla a la BD en my sql
Gracias lo tendré muy en cuenta
disculpe soy nuevo en java intento agregar una imagen que tome desde web cam, para que pase con otros datos como son documento y nombre
pero no se como activar el boton guardar
private void btnguardarActionPerformed(java.awt.event.ActionEvent evt) {
conexionbd mysql = new conexionbd();
Connection cn = mysql.conectar();
String txt1, txt2, txt3, txt4, txt5, txt6; // declarando los string
String sSQL = «»; // declarando los string
String Mensaje = «»; // declarando los string
txt1 = txtcedula.getText();
txt2 = cbogrado.getSelectedItem().toString();
txt3 = txtapellidos.getText();
txt4 = txtnombre.getText();// get devolver
txt5 = cbodependencia.getSelectedItem().toString();
txt6 = foto.getBinaryStream( in );
sSQL = «INSERT INTO funcionario (cedula, grado, apellidos, nombre, dependencia, foto)»
+ «VALUES(?, ?, ?, ?, ?, ?)»;// el? signica mas adelante lo asigno
Mensaje = «Datos Ingresados satisfactoriamente»;
try {
PreparedStatement pst = cn.prepareStatement(sSQL);
pst.setString(1, txt1);
pst.setString(2, txt2);
pst.setString(3, txt3);
pst.setString(4, txt4);
pst.setString(5, txt5);// set para asignar la cadena
pst.setBinaryStream(6, in);//asignar valor binario de la imagen
int n = pst.executeUpdate();
if (n > 0) {
JOptionPane.showMessageDialog(null, Mensaje);
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex);
}
}
****************************************************************************************************
y en el boton tomar foto no se como empezar…
private void btncapturaimagenActionPerformed(java.awt.event.ActionEvent evt) {
btncapturaimagen = new btncapturaimagen();
ByteArrayOutputStream out = new ByteArrayOutputStream(); // almacena en memoria para no guardar en pc
ImageIO.write((RenderedImage) img, «PNG», out); // convertir el array de datos a objeto escribirlo
InputStream in = new ByteArrayInputStream(out.toByteArray());
agradezco su colaboracion, he buscado mucho pero los ejemplos que hay siempre son flieinputstream que son como si ya tuviera la imagen en el pc.
hola amigo soy un poco nuevo en java yo hago una clase conexion para conectar con la base y tengo otra clase donde se carga la foto….en cual d las 2 clases coloco ese codigo…gracias por tu ayuda
Me ha funcionado perfectamente! Mil gracias por el aporte!
Muy buen tutorial. De Hecho yo ya pude hacer todo lo que me propuse con mi aplicación, solo me falta el ultimo proceso y es en el boton actualizar que tengo en mi interfaz grafica. Este boton en efecto hice que actualizara la información en un jtable, pero deseo que tambien actualice la imagen si deseo cambiarla y eso es lo que aún no hace mi aplicación, de todo lo demas ya lo hace. Agregar, borrar, modificar, etc…Podria alguien darme un poco de asesoria ??. 🙂
disculpe soy nuevo y qiero agregar una imagen ala base de datos con otra pc con tomcat y me sale q no encuenta el archivo quien me ase favor de ayudarme este es el codigo:
public String insertarProducto(String descripcion, String categoria,double precio,int stock,String dirArchivo){
String inserto=»»;
Connection cn=null;
PreparedStatement pr=null;
String sql=»INSERT INTO producto(descripcion,categoria,precio,stock, nombreImagen, tamannoImagen, fotoProducto) «;
sql+=»VALUES(?,?,?,?,?,?,?)»;
try{
Class.forName(classFor);
cn=DriverManager.getConnection(url, usuario,clave);
pr=cn.prepareStatement(sql);
pr.setString(1, descripcion);
pr.setString(2, categoria);
pr.setDouble(3, precio);
pr.setInt(4, stock);
pr.setString(5, descripcion+».jpg»);
//Parametros de la imagen
File fichero = new File(dirArchivo);
FileInputStream streamEntrada = new FileInputStream(fichero);
int tamañoImagen = streamEntrada.available();
//Establecer los parametros a la BD
pr.setInt(6, tamañoImagen);
pr.setBinaryStream(7, streamEntrada, (int) fichero.length());
if(pr.executeUpdate()==1){
inserto=»Se inserto el producto de forma correcta»;
}else{
inserto=»No se pudo insertar al producto»;
}
}catch(Exception ex){
inserto=ex.getMessage();
}finally{
try{
pr.close();
cn.close();
}catch(Exception ex){
}
}
return inserto;
}
Muy buenas,
gracias por el reporte 🙂
Un par de dudas que tengo en el objeto file, indicas que dentro de new file(ruta) ahi se debe poner la ruta.
Mi primera duda es como poner una ruta relativa ó absoluta a una imagen que no este dentro del proyecto, como por ejemplo en la carpeta imagenes de windows.
Y despues si la imagen la suben desde otro equipo diferente a donde estara alojada la aplicacion como indicar ahi la ruta?
Gracias por las aclaraciones 🙂