Imágenes en Base datos y Java

4
109083

Imágenes, Java/JDBC y MySQL

He recibido otra consulta que me ha gustado «¿como puedo almacenar y
recuperar imágenes en MySQL desde Java?». Hoy os vamos a contar paso a paso como
se puede hacer..

Muchos de vosotros que escribís preguntando por problemas en vuestros
programas, debéis ser comprensivos y tener en cuenta que recibimos muchas
peticiones diarias, no podemos atenderlas todas (el tiempo no da para tanto)
….. . Tratad de usar el foro y consultad los tutoriales disponibles, que
muchas cosas solicitadas las podéis encontrar ya resueltos.

Creación de la Tabla

En una de nuestras bases de datos, creamos una tabla (con
la consola de MySQL
) con los siguientes atributos

Insertar una fila en la tabla

Gracias a la consola, podemos insertar la primera imagen directamente:

Al pulsar sobre la columna de la imagen, automáticamente podemos
seleccionar un fichero a insertar.

Elegimos el desado

Como curiosidad de la foto, en las jardineras de mi ventana, podéis ver que
tengo habitualmente plantados melones (hay que disfrutar el placer de las cosas
simples) 😉

 

Programa de recuperación de los datos

El mejor modo de entender como realizar la recuperación de los datos es
leerse la propia especificación de JDBC que podéis encontrar en el Web de Sun:

http://java.sun.com/products/jdbc/download.html

Necesitamos por tanto, un objeto de tipo BLOB para acceder a los datos.
Volvemos a consultar la documentación, en este caso el API de JDBC
http://java.sun.com/j2se/1.3/docs/api/java/sql/Blob.html

Y escribimos un código sencillo (no tengáis en cuenta el diseño … ya que es
lamentable …. pero no quiero complicar su seguimiento)

Como curiosidad, podéis ver los tiempos:

Supongo que aquí os daréis cuenta de la necesidad de usar pooles de
conexiones.

Podéis descargaros el código aquí

Otros enlaces de Interés

Podéis encontrar información valiosa sobre codificadores de distintos
formatos en el siguiente enlace.

http://www.geocities.com/marcoschmidt.geo/java-image-coding.html

Aunque también os deberías fijar en las nuevas APIs y filtros para el
procesamiento de imágenes que ya incorpora Java en las ultimas versiones.

http://javaalmanac.com/egs/javax.imageio/Graphic2File.html

Conclusiones

Como es de prever, escribir es similar … ver
setBinaryStream

Lo bueno que tiene Java es lo fácil que nos hace el trabajo, con la
impresionante librería de clases que proporciona. El arte es saber encontrar los
recursos con velocidad.

Superados los problemas técnicos, solo nos quedan los problemas de negocio
(capturar bien requisitos, hacer un análisis antes de lanzarlos a picar…) y la
capacidad de hacer buenos diseños ….. cosa que poca gente tiene tiempo para
poder hacer (y conocimientos debido a la falta de tiempo) .

Sobre el
Autor ..

4 Comentarios

  1. public static void main(String[] args) throws Exception, IOException, SQLException {
    Class.forName(\\\»org.sqlite.JDBC\\\»);
    Connection conn= DriverManager.getConnection(\\\»jdbc:sqlite:bd.sqlite\\\»);
    PreparedStatement ps = conn.prepareStatement(\\\»insert into tutabla(tuscampos) values (?)\\\»);
    try {
    conn.setAutoCommit(false);
    File archivo = new File(\\\»rutadetuimagen\\\»);
    FileInputStream f = new FileInputStream(archivo);
    ps.setBinaryStream(1, f, (int) archivo.length());
    ps.executeUpdate();
    conn.commit();
    } finally {
    ps.close();
    }

    }

  2. Ante todo felicitarte por este magnifico tutorial ya que es muy dificil encotrar en la red informacion asi y bien detallada, no como otros que te ponen un super codigo tal vez copiado de sun y se las dan de que saben mucho.
    muy bien sigue asi

  3. QUE ESTOY HACIENDO MAL?.

    PORFA NECESITO AYUDA NO SE QUE ESTOY HACIENDO MAL, HE BUSCADO POR TODOS LADOS Y NO CONSIGO SOLUCION A MI ERROR.

    public void guardar_Cal() throws Exception{
    try {
    File file = new File(«src/archivos/calibraciones_file.calibracion»);
    FileInputStream fis = new FileInputStream(file);
    long datos = file.lastModified();
    Date fecha = new Date(datos);
    Connection accesoBBDD=miConexion.conectar();
    PreparedStatement ps = accesoBBDD.prepareStatement(«INSERT INTO digitalcal(FechaCal, Nombre, Calibraciones) VALUES(‘»+fecha.toString()+»‘, ‘erick’, ‘?’)»);
    ps.setBinaryStream(1, fis, file.length());
    ps.executeUpdate();
    ps.close();
    accesoBBDD.close();
    fis.close();
    } catch (Exception e) {
    e.printStackTrace();
    }

    SIEMPRE ME SALE ESTE ERROR

    java.lang.ArrayIndexOutOfBoundsException: 0
    at com.mysql.jdbc.PreparedStatement.setBinaryStream(PreparedStatement.java:3286)
    at com.mysql.jdbc.PreparedStatement.setBinaryStream(PreparedStatement.java:5269)

Dejar respuesta

Please enter your comment!
Please enter your name here