Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Base de Datos / Java / PostgreSQL / Guardar y Leer imagenes en PostgresSQL

Guardar y Leer imagenes en PostgresSQL

Por jc mouse jueves, junio 14, 2012

En este tutorial veremos una forma para registrar archivos JPG en una base de datos PostgreSQL y recuperarlos para utilizarlos en controles Swing. Como vimos en un tutorial anterior a este donde utilizamos una base de datos MySQL, el procedimiento es prácticamente el mismo, claro con pequeñas diferencias.

¿En que consiste guardar y leer imágenes en una base de datos?

Cuando se desea almacenar fisicamente el contenido de una imagen en una base de datos, este debe ser convertido a una cadena de bytes, para esto el campo donde se guardara la imagen debe ser del tipo BOOL en MySQL y para Postgres tenemos el tipo BYTEA, de esta manera podemos almacenar el contenido de un archivo JPG en la base de datos, ahora para recuperar el contenido de esta imagen y utilizarlo en nuestra aplicación, debemos procesar la cadena de bytes y convertirlo nuevamente en una imagen con la cual podamos trabajar.

Sin más, el tutorial.

Necesitamos

  • Java y Netbeans 6.9 o superior
  • Conector JDBC de Postgres. Yo utilizo postgresql-8.3-603.jdbc3.jar, ya existe la versión 9
  • Imágenes JPG para hacer la prueba no muy grandes.
  • pgAdminIII para trabajar con la base de datos
Nivel: Intermedio Avanzado
Tiempo: 20 minutos
COMENCEMOS.
1. Lo primero que necesitamos es una base de datos en Postgres, utilizando pgAdminIII crea una nueva base de datos [nombre: dbDemoImagen]  y añade la siguiente tabla:
CREATE TABLE imagen
(
  id character(6) NOT NULL,
  nombre character(64),
  archivo bytea
)
2. En netbeans, crea un nuevo proyecto y añade las siguientes clases:
Proyecto
--- Main.java
--- imagen.java
--- interfaz.java
--- postgres.java
Bibliotecas
--- Driver JDBC PostgreSQL
Donde Interfaz.java es de tipo JFrame, esta sera nuestra interfaz de usuario. En
2. En la clase JFrame: Interfaz.java, añade los siguientes controles:
Proyecto Netbeans

Proyecto Netbeans

OJO: Los nombres son importantes
3. Necesitamos una clase donde almacenar nuestra imagen para trabajar en netbeans, esta clase se llama imagen.java, y el código es el siguiente:
import java.awt.Image;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 * CLASE PARA ALMACENAR LOS DATOS DE LA TABLA IMAGEN
 */
public class imagen {

    private String id,name;
    private Image archivo;

    public Image getArchivo() {
        return archivo;
    }

    public void setArchivo(Image archivo) {
        this.archivo = archivo;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }    

    @Override
    public String toString() {
        return this.id+" : "+this.name;
    }

}
4. Una clase para la interacción entra nuestra aplicación y la base de datos, esta clase se llama postgres.java:
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.DefaultListModel;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 * CLASE PARA CONECTARSE A UNA BASE DE DATOS POSTEGRES, INSERTAR Y RECUPERAR IMAGENES JPG
 */
public class postgres {

   //DATOS PARA LA CONEXION
   private String bd = "dbDemoImagen";
   private String user = "postgres";
   private String password = "";
   private String url = "jdbc:postgresql://localhost:5432/dbDemoImagen/"+bd;

   private Connection connection = null;
   private ResultSet resultSet = null;
   private Statement statement = null;

    //Constructor de clase que se conecta a la base de datoS
    public postgres()
    {
      try{
         Class.forName("org.postgresql.Driver");         
         connection = DriverManager.getConnection(url, user , password);
         System.out.println("Conectado a la base de datos [ " + this.bd + "]");
      }catch(Exception e){
         System.err.println(e.getMessage());
      }
    }

    /* metodo que guarda una imagen JPG en la base de datos
 * input: ID : identificador unico para el registro, osea primary key
 * name: nombre de la imagen para reconocerlo mas adelante
 * ruta: direccion absoluta de la imagen JPG
 */
    public boolean guardarfoto(String id, String name, String ruta) {
        FileInputStream fis = null;
        try {
             File file = new File(ruta);
             fis = new FileInputStream(file);
             PreparedStatement pstm = connection.prepareStatement("INSERT into " +
                        " imagen(id, nombre, archivo) " + " VALUES(?,?,?)");
             pstm.setString(1, id);
             pstm.setString(2, name);
             pstm.setBinaryStream(3, fis,(int) file.length());
             pstm.execute();
             pstm.close();
             return true;
        } catch (FileNotFoundException e) {
             System.out.println(e.getMessage());
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
               fis.close();
             } catch (IOException e) {
               System.out.println(e.getMessage());
             }
        }
        return false;
   }

    /* Metodo que convierte una cadena de bytes en una imagen JPG
 * input:
 * bytes: array que contiene los binarios de la imagen
 * Output: la foto JPG en formato IMAGE
 */
 private Image ConvertirImagen(byte[] bytes) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
    Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");    
    ImageReader reader = (ImageReader) readers.next();
    Object source = bis;
    ImageInputStream iis = ImageIO.createImageInputStream(source);
    reader.setInput(iis, true);
    ImageReadParam param = reader.getDefaultReadParam();
    return reader.read(0, param);
 }

 /* Metodo que extrae los registros de la tabla IMAGEN de la base de datos
 * crea instancia nueva de la clase imagen.java y añade los datos
 * agrega estos datos a un DefaultListModel
 * output:
 * dml: Es un DefaultListModel que contiene instancia de la clase imagen.java
 */
    public DefaultListModel Lista_Imagenes()
    {
        DefaultListModel dml = new DefaultListModel();
        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("SELECT id,nombre,archivo FROM imagen " );
          while (resultSet.next())
          {  //se crea un objeto CITA y se le van agregando los datos
             imagen img = new imagen();
             img.setId( resultSet.getString("id") ) ;
             img.setName( resultSet.getString("nombre") ) ;
             try { //antes de agregar el campo imagen, realiza la conversion de bytes a JPG
                 img.setArchivo(ConvertirImagen(resultSet.getBytes("archivo")));
             } catch (IOException ex) {
                System.err.println(ex.getMessage());
             }
             //por ultimo añade el objeto imagen:img al DefaultListModel
            dml.addElement(img);
          }
       }
       catch (SQLException ex) {
          System.err.println(ex.getMessage());
       }
       return dml;
    }

}
5 Para terminar debemos implementar todo en nuestra interfaz.
los import que utilizamos son:
import java.awt.Image;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
Declaramos también :
private postgres Pg = new postgres();
    //Para almacenar la clase imagen
    private DefaultListModel modListaImagen = new DefaultListModel();
En el constructor de clase declaramos:
 /** Creates new form interfaz */
    public interfaz() {
        initComponents();
        this.setTitle("Postreges Imagenes Save/Open [https://www.jc-mouse.net/]");
        this.setLocationRelativeTo(null);
        //se carga los registros de la base de datos
        Actualizar_lista();
    }
Creamos tambien dos métodos privados:
    //Se conecta a la base de datos y obtiene registros
    private void Actualizar_lista()
    {
        this.modListaImagen.clear();
        this.modListaImagen = Pg.Lista_Imagenes();
        this.Lista_Imagenes.setModel(modListaImagen);
    }

    //Genera un código unico para la imagen
    private String GenerarCodigo()
    {
        SimpleDateFormat sdf= new SimpleDateFormat("hhmmss");
        return sdf.format(new Date());
    }
En el evento Clicked del JLista colocamos:
private void Lista_ImagenesMouseClicked(java.awt.event.MouseEvent evt) {                                    
        int index = this.Lista_Imagenes.getSelectedIndex();//obtiene index seleccionado
        if( index != -1)
        {
            //Extrae la clase imagen que corresponde a la posición donde se hizo un clic
            imagen img = (imagen)this.modListaImagen.getElementAt(index);
            //redimensiona imagen
            double alto = img.getArchivo().getHeight(null) / Math.ceil(img.getArchivo().getHeight(null)/300f) ;
            double ancho =img.getArchivo().getWidth(null) / Math.ceil(img.getArchivo().getWidth(null)/320f) ;
            Icon icon = new ImageIcon( img.getArchivo().getScaledInstance((int)ancho,(int)alto, Image.SCALE_AREA_AVERAGING) );            
            this.FOTO.setText("");
            this.FOTO.setIcon( icon  );//coloca imagen en el JLabel
        }
    }
Para terminar en el evento ActionPerformed del item del menu jmSave, colocamos
 private void jmSaveActionPerformed(java.awt.event.ActionEvent evt) {                                       
       JFileChooser fileChooser = new JFileChooser();
       fileChooser.setFileFilter( new FileNameExtensionFilter("Archivo de Imagen","jpg") );
       fileChooser.setCurrentDirectory(new java.io.File("e:/imagenes_tmp/"));
       int result = fileChooser.showOpenDialog(null);
        if ( result == JFileChooser.APPROVE_OPTION ){
            //obtiene ruta y nombre del archivo
            String ruta = fileChooser.getSelectedFile().getAbsolutePath();
            String name = fileChooser.getSelectedFile().getName();
            if( Pg.guardarfoto( GenerarCodigo() , name, ruta ) )
            {
                JOptionPane.showMessageDialog(this,"Imagen ["+name+"] almacenada en la base de datos");
                Actualizar_lista();
            }
        }
    }
Terminamos y no deberíamos tener ningún problema, si es así, revisa todos los pasos nuevamente, caso contrario ejecuta el proyecto:
pg imagen
  • Descargate el proyecto en Netbeans 6.9 AQUI

Tags

Artículos similares

Escalar imagen en java

Esta aplicacion permite escalar una imagen desde java sin perder las proporciones de la misma, utiliza SCALE_AREA_AVERAG[...]

Depuración avanzada en PHP

Xdebug es una extensión para PHP que nos ayuda con la depuración y el desarrollo de aplicaciones. Contiene un depurador[...]

Ejemplo práctico de MVC java Swing con Netbeans

Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la inter[...]

Lightweight Java Game Library

¿Quien no ha querido programar un juego? creo que la mayoría si no es que todos los que conocen de programación sin impo[...]

Uso de Arrays: Ejemplo práctico

En este post iremos conociendo de un modo práctico que es y como se utiliza un Array en java, para esto partiremos de un[...]

Aplicaciones java con Maven

¿Qué es Maven? Maven es una herramienta de software para la gestión y construcción de proyectos Java. Provee un conjunto[...]