ARCmop Java Programacion Solaris Linux

Java-linux-programacion

Java: Guardar Imagen en Base de Datos Mysql, BLOB

Posted by Cmop en mayo 22, 2010

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.

27 comentarios to “Java: Guardar Imagen en Base de Datos Mysql, BLOB”

  1. elkjaer said

    Muy bueno, de mucha ayuda

  2. Peli said

    Gracias!!! =)

  3. Peli said

    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

  4. omar said

    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

    • Cmop said

      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.

  5. javahierro said

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

  6. javahierro said

    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?

  7. omar said

    como le pongo ese codigo a un boton? gracias ññ

  8. javahierro said

    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

    • Cmop said

      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

  9. Manuel said

    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”);
    }

  10. david said

    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

  11. Gustavo said

    Gracias lo tendré muy en cuenta

  12. harol said

    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.

  13. Christian said

    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

  14. Kami said

    Me ha funcionado perfectamente! Mil gracias por el aporte!

  15. Mario Z said

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

  16. jooi said

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: