miércoles, 25 de febrero de 2009

Guardar imágenes en base de datos usando JPA

Hay infinidad de ejemplos de cómo guardar una imagen a base de datos con JDBC, y cómo recuperarla.

Pues esta vez mostraré un ejemplo usando JPA.

Supongamos que nuestra clase entidad tiene una propiedad llamada imagen que es donde se guardará la imagen. Esta propiedad debe declararse así:

@Lob
@Column(name = "imagen")
private byte[] imagen;


Para guardar una imagen (supongamos una que esté en el disco), debemos realizar lo siguiente:
Entidad i = new Entidad(); // nuestra entidad
File f = new File("D:/Imagen006.jpg"); //asociamos el archivo fisico
InputStream is = new FileInputStream(f); //lo abrimos. Lo importante es que sea un InputStream
byte[] buffer = new byte[(int) f.length()]; //creamos el buffer
int readers = is.read(buffer); //leemos el archivo al buffer
i.setImagen(buffer); //lo guardamos en la entidad
em.persist(i); //y lo colocamos en el EntityManager


Ahora, para recuperar el contenido haremos que se muestre el contenido en un JFrame:

Entidad ent = em.find(Entidad.class, new Integer(1)); //ubicamos una entidad
Image image=new ToolkitImage(new ByteArrayImageSource(ent.getImagen())); //lo convertimos a Image
JLabel label=new JLabel(new ImageIcon(image)); //creamos un JLabel con la imagen como icono
JFrame frame=new JFrame("imagen"); //creamos el jframe
frame.setLayout(new BorderLayout()); //.. con un Layout clasico
frame.add(label,BorderLayout.CENTER); //.. agregamos el JLabel en el centro
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); //y lo mostramos


Después haré un ejemplo usando JTable, y - si puedo - usando ICEfaces.


8 comentarios:

  1. buenisimo ejemplo , lo que estaba buscando, gracias por compartir de esa forma nos todos enriquesemos el conocimiento

    ResponderEliminar
  2. alguien sabe porque en una base de datos MySql no puedo guardar una foto que pese mas de 100k , definiendo un campo BLOB por supuesto?

    ResponderEliminar
  3. Porque el BLOB tiene un limite de tamaño
    Usa el tipo MEDIUMBLOB o LONGBLOB.

    Revisa aquí:
    http://dev.mysql.com/doc/refman/5.0/es/blob.html

    ResponderEliminar
  4. hola pues te cuento q trate de seguir tu tutorial y pues el subir la foto si me deja, pero el descargarlo no me da algo asi:

    Description: An unhandled exception occurred during the execution of the web application. Please review the following stack trace for more information regarding the error.

    Exception Details: java.lang.IllegalArgumentException
    You have provided an instance of an incorrect PK class for this find operation. Class expected : class java.lang.Long, Class received : class java.lang.Integer.

    Possible Source of Error:
    Class Name: oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl
    File Name: EntityManagerImpl.java
    Method Name: findInternal
    Line Number: 312

    Source not available. Information regarding the location of the exception can be identified using the exception stack trace below.

    me gustaria saber como puedo para simplemente descargarla en el disco duro sin necesidad de visualizarla en frame o si tienes el ejemplo completo donde se puede descargar
    Gacias

    ResponderEliminar
  5. El error es claro
    "Class expected: class java.lang.Long, Class received : class java.lang.Integer." (La clase esperada es Long pero se recibió Integer) Y se refiere a la clave primaria (an incorrect PK class )
    Intenta cambiar el tipo de la clave primaria de tu clase entidad. Es posible que sea Long, así que ponle Integer.

    ResponderEliminar
  6. hola esta muy buena el ejemplo y la explicacion, te felicito y gracias por compartir tu conocimiento.

    ResponderEliminar
  7. hola, muy bueno! pregunto en icefaces se puede usar?

    ResponderEliminar

Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups


Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/