Cargar imagen guardada en MySQL desde java

Siguiendo con el tema de cómo guardar una imagen en MySQL desde Java ahora vamos a explicar con un código bastante sencillo cómo recuperar la imagen guarda en bytes en la base de de datos, y guardarla físicamente en algún lugar de nuestro disco duro.

Los pasos para realizar la restauración de la imagenes son los siguientes:
1. crear la conexión
2. ejecuatar la consulta SQL
3. crear un archivo de imagen físico vacio
4. escribir los bytes en el archivo de imagen

Rápidamente creamos la conexión a la base de datos con los datos elementales: host, nombre de la base de datos, usuario y la contraseña. La conexión debería quedar algo así:

Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/myjsp", "root", "adminadmin");

Ahora vamos a ejecutar la consulta. Usando el objeto PreparedStatement para ejecuar la consulta y el objeto ResultSet para almacenar el resultado de la consulta el código quedaría:

PreparedStatement stmt = conn.prepareStatement("SELECT nombre, imagen FROM fotos");
ResultSet resultSet = stmt.executeQuery();

El objeto ResultSet es una tabla que está en memoria y que tiene la estructura de acuerdo a la consulta que se haya realizado, en este caso es una tabla con dos columnas: columna nombre (índice 1) y la columna imagen (índice 2). Lo siguiente es extraer el String de la columna del nombre con resultSet.getString(1) y extraer los bytes de la columna imagen con resultSet.getBinaryStream(2), veamos como queda:

ResultSet resultSet = stmt.executeQuery();
while (resultSet.next()) {
String name = resultSet.getString(1);
File image = new File("C:\\logo2.jpg");
FileOutputStream fos = new FileOutputStream(image);

byte[] buffer = new byte[1];
InputStream is = resultSet.getBinaryStream(2);

EL paso final es tomar el vector de bytes byte [] buffer y escribir esos bytes de uno en uno en el archivo fïsico que se habia creado anteriormente. Para eso vamos a usar el objeto FileOutputStream que esta asocioado a dicho archivo.

byte[] buffer = new byte[1];
InputStream is = resultSet.getBinaryStream(2);
while (is.read(buffer) > 0) {
fos.write(buffer);
}

Y el ejemplo completo quedaría de la siguiente manera:

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.File;
import java.io.FileOutputStream;

/**
*
* @author manix
*/
public class CargarImagen {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/myjsp", "root", "adminadmin");

PreparedStatement stmt = conn.prepareStatement("SELECT nombre, imagen FROM fotos");
ResultSet resultSet = stmt.executeQuery();
while (resultSet.next()) {
String name = resultSet.getString(1);
File image = new File("C:\\logo2.jpg");
FileOutputStream fos = new FileOutputStream(image);

byte[] buffer = new byte[1];
InputStream is = resultSet.getBinaryStream(2);
while (is.read(buffer) > 0) {
fos.write(buffer);
}
}

} catch (Exception e) {
}

}
}

Acá dejo adjunto la clase de ejemplo y la estructura de la tabla donde esta alojada la imagen: CargarImagen.java y tabla.txt

Puedes ver támbien el tema de cómo guardar una imagen en MySQL desde Java

5 comments

  1. hola.
    Si hay varias imagenes por Id, como las obtengo para mostrarla cada una en un jbutton..

    es decir en la tabla fotos hay 3 campos idCLiente, idfoto, foto..

  2. Hola, una consulta, yo estoi haciendo una aplicacion con JSP, y necesito sacar la imagen de la base de datos, eso se haria con lo que das como ejemplo, pero como hago para mostrarla en el HTML?

    Saludos.-

  3. disculpa yo he probado tus ejemplos y solo funciona para guardar la imagen pero cuando la quiero guardar me lanza este error

    Exception in thread “main” com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry ’2′ for key 1

    si me pudieras a yudar te lo agradeceria mucho

  4. soy yo otra vez te decia que cuandoquiero jalar la imagen me marca el error

    Exception in thread “main” com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry ‘2′ for key 1

    necesito ayuda

  5. Hola disculpa quiero generar una aplicacion de escritorio que me permita guardar una imagen que yo dinamicamente seleccione. Me gustaria usar filechocer para que el usuario seleccione la imagen y se valla al manejador (mysql) y que me permita cargar esa misma imagen tambien.
    quisiera de su ayuda o su consejo

Trackbacks/Pingbacks

  1. Apuntes de programación » Guardar imagen en MySQL desde Java - [...] puedes ver el tem de como cargar una imagen guardada en MySQL desde Java Jueves, ...

Leave a Reply