Java: Guardar Imagen en Base de Datos Mysql, BLOB

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.

28 comentarios sobre “Java: Guardar Imagen en Base de Datos Mysql, BLOB

  1. 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

  2. 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

    1. 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.

  3. Como puedo recibirlo desde un formulario html/jsp asi como los demas datos string request.getParameter() y luego enviarlo al método ????????

      1. 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?

      2. 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

  4. 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?

  5. 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

    1. 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

  6. 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»);
    }

  7. 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.

  8. 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

  9. 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 ??. 🙂

  10. 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;
    }

  11. 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 🙂

Replica a Cmop Cancelar la respuesta