miércoles, 19 de noviembre de 2008

Insertar una imagen en una base de datos mediante una aplicacion stand alone

En la entrada anterior vimos como insertar una imagen en la base de datos en una app web, bueno el procedimiento anterior es aplicable a cualquier otro archivo ya que en donde se inserta es un dato de tipo BLOB es decir un archivo muy grande (bueno creo que es hasta 4gb) en modo binario, ahora veremos como hacerlo desde la aplicación stand alone o de escritorio (Esto lo pidieron en un comentario jejeje).

El proyecto lo hice en netbeans, Lo que necesitamos:

- Driver para la base de datos, (en mi caso es derbyclient.jar)
- Base de datos con soporte para datos BLOB
- Netbeans (opcional)

Tenemos la siguiente tabla (la definición corresponde a derby tal vez necesite adecuarse para MySql y/u otras) :

create table IMAGEN_T
(
ID_IMAGEN INTEGER not null primary key,
DESCRIPCION VARCHAR(100),
IMAGEN BLOB(1048576)
)

Para insertar las imágenes tenemos un DAO el cual contiene el método insertaImagen (aunque este método debe funcionar para cualquier archivo recordemos que el archivo se guarda en binario)

insertaImagen(String nameFile, int id)
throws FileNotFoundException, SQLException{

File fileIn = new File(nameFile);
InputStream fis = new FileInputStream(fileIn);
ps = conn.prepareStatement("INSERT INTO IMAGEN_T VALUES (?, ?, ?)");
ps.setInt(1,id);
ps.setString(2, "Probando insertar una imagen");
int fileLength = (int) fileIn.length();
System.out.println(" los datos " + fileLength + " fis " + fis.toString());
ps.setBinaryStream(3, fis, fileLength);
ps.executeUpdate();
ps.close();

}

En este método creamos un File con el nombre del archivo que recibe (el nombre contiene la ruta completa) para a su vez crear un FileInputStream que a su vez asignamos a un InputStream, con estos objetos se leerán los bytes del archivo, obtenemos un objeto PreparedStatment y colocamos el id para el registro, una descripción (aqui podria ser mejor guardar el nombre para cuando se necesite recuperar el archivo recuerden que esta app es solo un ejemplo) y posteriormente se realiza el setBinaryStream y le pasamos el objeto InputStream para que pueda leer los bytes y también le pasamos el tamaño del archivo es decir el numero de bytes que se tienen que leer.

A continuación tenemos el método que recupera el archivo:

recuperaImagenBD(int idImagen, String path)
throws IOException, SQLException{

FileOutputStream fos = null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs = null;
Statement st = null;
String sql = "SELECT IMAGEN FROM IMAGEN_T WHERE ID_IMAGEN = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, idImagen);

rs = ps.executeQuery();
if (rs.next()){

String pathname= path;
File file = new File(pathname);
fos = new FileOutputStream(file);
Blob bin = rs.getBlob("IMAGEN");
InputStream inStream = bin.getBinaryStream();
int size = (int)bin.length();
byte[] buffer = new byte[size];
int length = -1;
while ((length = inStream.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
}

}

En este método tenemos que crear un objeto FileOutputStream para poder escribir los bytes que nos retorna la consulta, a este objeto le pasamos un objeto file que ha sido creado con una ruta donde se guardara el archivo, después obtenemos el dato BLOB y de este obtenemos un objeto InputStream para leer los bytes, después obtenemos el numero de bytes del Blob, posteriormente creamos un arreglo de bytes en el que se leerán los bytes y de donde el outputStream obtendrá los bytes, le hice una pequeña ventanita para hacer pruebitas



En cuanto pueda colocare los proyectos en algun servicio de hostig, si alguien le intereas el codigo escriba un comentario con su mail para enviarselos.
Tal vez haya algunas mejoras en el código, espero sus comentarios ...

10 comentarios:

Unknown dijo...

esta muy bueno el codigo sera que me puede regalar el archivo fuente brauliofg@gmail.com

Anónimo dijo...

bueno el ejercicio podras enviar el codigo fuente al correo dulceangelito_9@hotmail.com

Anónimo dijo...

Bueno el codigo..!!! me puedes enviar el codigo gracias... yamil.kbyo@gmail.com

jacobo kuyoc dijo...

hola, esta muy bueno el codigo sera que me puede regalar el archivo fuente jacobo_kuyoc@gmail.com


podrias hacer un ejemplo de como guardar las huellas digitales en una base de datos usando netbeans 6.9.1? porfa...urge!!!

Antonio dijo...

podrías enviarme el código de favor a america_921002@hotmail.com

pirataxa dijo...

sta muy buena el blog....ayudame con el codigo pirataxa@hotmail.com

tuxito dijo...

bueno el tutorial solo una duda para que sirve el "ps" y donde lo declaras? perdon si estoy perdido es que recien aprendo java porfa enviame el codigo a danielmiguel.c@gmail.com

Anónimo dijo...

hola como estas esta chido el programita serakme puedas enviar tu codigo fuente mi correo es yoel_nemesis@hotmail.com

Anónimo dijo...

buen aporte, me puedes compartir el código, es para fines educativos.

pgmelendez@hotmail.com

Jemys dijo...

Me puedes,enviar el proyecto, por favor?. Mi correo es jemysjones@gmail.com