Guardar y Leer Imagenes en Mysql con Java

Anuncio
Guardar y Leer Imagenes en Mysql con Java
En este Articulo veremos como Guardar y Leer Imagenes en Mysql con Java, guardar imagenes en
una base de datos para su posterior uso es algo fundamental en programacion. En resumen veremos
los 2 metodos principales que nos permitiran hacer esto, un metodo para guardar una Imagen en la
base de datos en un campo de tipo blob, y un metodo que nos permite obtener el contenido de ese
campo y convertilo a un arreglo de bytes para su posterior conversion a objeto Image de Java y asi
poder escribirlo de nuevo a disco.
Lo que Haremos...
Realizaremos una aplicacion que estara divida en dos partes, en la parte superior podremos
seleccionar una imagen de nuestro disco duro, ver una vista previa de la imagen y un boton para
guardar en la base de datos. La parte Inferior tendremos una vista previa de todas las imagenes que
se encuentran en la base de datos y un boton para leer esa imagen, seleccionar donde queremos
guardarla y guardarla en disco.
Tendra el siguiente Aspecto:
Antes de..
El proyecto lo hemos desarrollado con Netbeans y hemos importado el conector de mysql para
hacer la conexion con la base de datos. En la Base de Datos existe una tabla llamada Imagenes con
los campos: idImagen, imagen y nombre, esta tabla fue realizada con la siguiente instruccion mysql:
create table Imagenes(idImagen int not null auto_increment,imagen blob
not null,nombre varchar(30),key(idImagen))engine=Innodb;
[note]
El tipo de campo Blob son objetos binarios grandes en los que podemos almacenar Imagenes (en
realidad todo tipo de objetos), pero no son los unicos tambien existen TINYBLOB, MEDIUMBLOB
and LONGBLOB. Las Diferencias? visita el siguiente enlace.
[/note]
Utilizaremos..
Connection conexion;
Statement st;
public BaseDatos(String host,String user, String pass){
try {
Class.forName("com.mysql.jdbc.Driver");
conexion =
DriverManager.getConnection("jdbc:mysql://"+host+"/pruebas", user, pass);
st = conexion.createStatement();
} catch (Exception ex) {
Logger.getLogger(BaseDatos.class.getName()).log(Level.SEVERE,
null, ex);
}
}
Guardar Imagenes en La Base de Datos
El siguiente metodo recibe una cadena String con la ruta de la imagen en disco y el nombre de la
imagen(para cuando se quiera leer y guardar de nuevo a disco), despues se utiliza el metodo
setBinaryStream para insertar en la Base de Datos.
public boolean guardarImagen(String ruta,String nombre){
String insert = "insert into Imagenes(imagen,nombre) values(?,?)";
FileInputStream fis = null;
PreparedStatement ps = null;
try {
conexion.setAutoCommit(false);
File file = new File(ruta);
fis = new FileInputStream(file);
ps = conexion.prepareStatement(insert);
ps.setBinaryStream(1,fis,(int)file.length());
ps.setString(2, nombre);
ps.executeUpdate();
conexion.commit();
return true;
} catch (Exception ex) {
Logger.getLogger(BaseDatos.class.getName()).log(Level.SEVERE,
null, ex);
}finally{
try {
ps.close();
fis.close();
} catch (Exception ex) {
Logger.getLogger(BaseDatos.class.getName()).log(Level.SEVERE,
null, ex);
}
}
return false;
}
Leer Imagenes desde La Base de Datos
El siguiente Metodo devuelve un Arraylist de Objetos tipo Imagen, este tipo Imagen es una clase
definida por nosotros para guardar tanto la imagen como el nombre de esta, esta clase la veremos
mas adelante. Despues Seleccionamos todas las imagenes y nombres de la base de datos, obtenemos
el campo tipo blob y convertimos a imagen, obtenemos el nombre de la imagen y luego los
agregamos en nuevo tipo Imagen, este proceso se repite hasta que se agregen todas las imagenes de
la base de datos en nuestro ArrayList, luego retornamos esta lista con todas las imagenes y nombres
de imagen.
ArrayList < Imagen > getImagenes() {
ArrayList < Imagen > lista = new ArrayList();
try {
ResultSet rs = st.executeQuery("SELECT imagen,nombre FROM
Imagenes");
while (rs.next())
{
Imagen imagen=new Imagen();
Blob blob = rs.getBlob("imagen");
String nombre = rs.getObject("nombre").toString();
byte[] data = blob.getBytes(1,
(int)blob.length());
BufferedImage img = null;
try {
img = ImageIO.read(new
ByteArrayInputStream(data));
} catch (IOException ex) {
Logger.getLogger(BaseDatos.class.getName()).log(Level.SEVERE,
null, ex);
}
imagen.setImagen(img);
imagen.setNombre(nombre);
lista.add(imagen);
}
rs.close();
} catch (SQLException ex) {
Logger.getLogger(BaseDatos.class.getName()).log(Level.SEVERE,
null, ex);
}
return lista;
}

Clase Imagen
Nos sirver para guardar la Relacion entre Imagen y nombre de Imagen.
public class Imagen {
Image imagen;
String nombre;
public void setImagen(Image imagen) {
this.imagen = imagen;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Image getImagen() {
return imagen;
}
public String getNombre() {
return nombre;
}
}
Post completo en: http://jonathanmelgoza.com/blog/guardar-y-leer-imagenes-en-mysql-conjava/#ixzz3CNInz49Y
Descargar