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
Para guardar una imagen (supongamos una que esté en el disco), debemos realizar lo siguiente:
Ahora, para recuperar el contenido haremos que se muestre el contenido en un JFrame:
Después haré un ejemplo usando JTable, y - si puedo - usando ICEfaces.
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.
dame el progra,ma hecho
ردحذفbuenisimo ejemplo , lo que estaba buscando, gracias por compartir de esa forma nos todos enriquesemos el conocimiento
ردحذف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?
ردحذف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
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
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.
hola esta muy buena el ejemplo y la explicacion, te felicito y gracias por compartir tu conocimiento.
ردحذفhola, muy bueno! pregunto en icefaces se puede usar?
ردحذف