En este blog se aprenderá a utilizar el componente de primefaces que es fileupload que es para subir archivos al servidor con la diferencia de que solo se subirán imágenes y los datos de la imagen así como la ruta de la imagen se almacene en la BD que tenemos en postgres de acuerdo, ojo como lo he mencionado antes hay que tener previos conocimientos en java y los frameworks que se están utilizando para los ejercicios y lecciones.
Haremos que se cree una carpeta como el blog anterior que se llamara de acuerdo al año en el que estamos porque así me pidieron el sistema xD, y dentro de ella otras carpetas con diferentes tipos de niveles de educación y de acuerdo al nivel seleccionado se almacenara la imagen y los datos de la misma en la BD para después mostrarlos en consultas, pero solo nos enfocaremos mientras en la subida de archivos al servidor de acuerdo.
Tendremos un formulario el cual se encargara de registrar los datos de la imagen que subiremos al servidor con fileupload este es nuestro cogido del formulario:
<p:accordionPanel dynamic="true" cache="true">
<p:tab title="Subir Archivos Modo Simple">
<h:form id="tehry" enctype="multipart/form-data">
<p:growl id="growl" showDetail="true"/>
<p:fileUpload value="#{managedBeanFileImagesUpload.file}" mode="simple" update="growl"/>
<h:panelGrid columns="2">
<p:outputLabel value="Etiquetas" for="txtEtiqueta"/>
<p:inputText id="txtEtiqueta" label="Etiquetas" placeholder="Etiquetas" title="Ejem. escuela, basico, secundaria" value="#{managedBeanFileImagesUpload.getResource().etiquetas}"/>
<p:outputLabel for="perfile" value="Nivel Edicativo" />
<p:selectOneMenu id="perfile" value="#{managedBeanFileImagesUpload.nivel}" style="width:125px">
<f:selectItem itemLabel="Pre-escolar" />
<f:selectItem itemLabel="Primaria"/>
<f:selectItem itemLabel="Secundaria" />
<f:selectItem itemLabel="Media Superior" />
</p:selectOneMenu>
<p:outputLabel value="Año Foto" for="txtFoto"/>
<p:inputText id="txtFoto" label="Año Foto" placeholder="2014/2" value="#{managedBeanFileImagesUpload.getResource().anio}"/>
</h:panelGrid>
<h:commandButton value="Subir" action="#{managedBeanFileImagesUpload.upload()}" actionListener="#{managedBeanFileImagesUpload.registerUser()}"/>
</h:form>
</p:tab>
</p:accordionPanel>
el bean de este formulario debe quedar asi:
package com.inee.bean;
import com.inee.dao.ResourceDAO;
import com.inee.models.Video;
import com.inee.util.HibernateUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.primefaces.model.UploadedFile;
/**
*
* @author By Davho
*/
@ManagedBean
@RequestScoped
public class ManagedBeanFileImagesUpload implements Serializable {
private String destino = "C:\\INEE\\BankImage\\";
private UploadedFile file;
private Session session;
private Transaction transaction;
private String nivel;
private Video resource;
File carpeta, preescolar1, primaria1, secundaria1, media1;
String dir1;
Calendar fecha;
String nombre1;
String preescolar = "\\Pre-escolar\\";
String primaria = "\\Primaria\\";
String secundaria = "\\Secundaria\\";
String media = "\\Media Superior\\";
/*en el constructor se inicializa lo que es el instancia miento del modelo, se obtendra la fecha que servira para nombrar la carpeta principal y dentro de ella se crean las demas y con el mkdir es para verificar que la carpeta no exista si existe no la crea, sino existe la creara de acuerdo*/
public ManagedBeanFileImagesUpload() {
resource = new Video();
fecha = Calendar.getInstance();
int año = fecha.get(Calendar.YEAR);
nombre1 = Integer.toString(año);
carpeta = new File(destino + nombre1);
if(carpeta.mkdir() == true){
preescolar1 = new File(carpeta + preescolar);
primaria1 = new File(carpeta + primaria);
secundaria1 = new File(carpeta + secundaria);
media1 = new File(carpeta + media);
preescolar1.mkdir();
primaria1.mkdir();
secundaria1.mkdir();
media1.mkdir();
}
}
/*metodo para copear la imagen seleccionada a la carpeta preescolar */
public void transferirPreescolar(String fileName, InputStream in) {
try {
//se encarga de crear al archivo (imagen)
OutputStream o = new FileOutputStream(new File(destino+nombre1+preescolar + fileName));
int reader = 0;
byte[] bytes = new byte [(int) getFile().getSize()];
while((reader = in.read(bytes)) != -1){
o.write(bytes, 0, reader);
}
in.close();
o.flush();
o.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/*metodo para copear la imagen seleccionada a la carpeta primaria */
public void transferirPrimaria(String fileName, InputStream in) {
try {
OutputStream o = new FileOutputStream(new File(destino+nombre1+primaria+ fileName));
int reader = 0;
byte[] bytes = new byte [(int) getFile().getSize()];
while((reader = in.read(bytes)) != -1){
o.write(bytes, 0, reader);
}
in.close();
o.flush();
o.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/*metodo para copear la imagen seleccionada a la carpeta secundaria */
public void transferirSecundaria(String fileName, InputStream in) {
try {
OutputStream o = new FileOutputStream(new File(destino+nombre1+secundaria + fileName));
int reader = 0;
byte[] bytes = new byte [(int) getFile().getSize()];
while((reader = in.read(bytes)) != -1){
o.write(bytes, 0, reader);
}
in.close();
o.flush();
o.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/*metodo para copear la imagen seleccionada a la carpeta media superior */
public void transferirMedia(String fileName, InputStream in) {
try {
OutputStream o = new FileOutputStream(new File(destino+nombre1+media + fileName));
int reader = 0;
byte[] bytes = new byte [(int) getFile().getSize()];
while((reader = in.read(bytes)) != -1){
o.write(bytes, 0, reader);
}
in.close();
o.flush();
o.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/*metodo para obtener el archivo seleccionado*/
public void upload() throws Exception {
//variable para validar extencion del archivo
String txtValidador;
//si obtenemos un archivo
if(getFile() != null){
//variable con el nombre del archivo seleccionado
String ext = getFile().getFileName();
//verificamos la extencion del archivo que sea verdadera
if(ext != null){
txtValidador = ext.substring(ext.indexOf(".")+1);
}else{
txtValidador = "null";
}
/*verificamos que la extencion del archivo sea jpg para este ejemplo si es verdadero proseguimos*/
if(txtValidador.equals("jpg")){
/*creamos un switch para obtener el nivel seleccionado del formulario y de acuerdo al nivel mandar a crear o almacenar la imagen a la carpeta predestinada */
switch (getNivel()) {
case "Secundaria":
try {
transferirSecundaria(getFile().getFileName(), getFile().getInputstream());
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Datos de la Foto", "Archivo: " + getFile().getFileName() + " subido al servidor \n\n Tipo de Archivo: " +
getFile().getContentType() + "\n\n Tamaño del archivo: " + getFile().getSize() +
" bytes , con destino a: " +destino+nombre1+secundaria+getFile().getFileName()));
}catch (Exception e) {
Logger.getLogger(ManagedBeanFileImagesUpload.class.getName()).log(Level.SEVERE, null, e);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
}
break;
case "Media Superior":
try {
transferirMedia(getFile().getFileName(), getFile().getInputstream());
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Datos de la Foto", "Archivo: " + getFile().getFileName() + " subido al servidor \n\n Tipo de Archivo: " +
getFile().getContentType() + "\n\n Tamaño del archivo: " + getFile().getSize() +
" bytes , con destino a: " +destino+nombre1+media+getFile().getFileName()));
}catch (Exception e) {
Logger.getLogger(ManagedBeanFileImagesUpload.class.getName()).log(Level.SEVERE, null, e);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
}
break;
case "Primaria":
try {
transferirPrimaria(getFile().getFileName(), getFile().getInputstream());
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Datos de la Foto", "Archivo: " + getFile().getFileName() + " subido al servidor \n\n Tipo de Archivo: " +
getFile().getContentType() + "\n\n Tamaño del archivo: " + getFile().getSize() +
" bytes , con destino a: " +destino+nombre1+primaria+getFile().getFileName()));
}catch (Exception e) {
Logger.getLogger(ManagedBeanFileImagesUpload.class.getName()).log(Level.SEVERE, null, e);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
}
break;
default:
try {
transferirPreescolar(getFile().getFileName(), getFile().getInputstream());
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Datos de la Foto", "Archivo: " + getFile().getFileName() + " subido al servidor \n\n Tipo de Archivo: " +
getFile().getContentType() + "\n\n Tamaño del archivo: " + getFile().getSize() +
" bytes , con destino a: " +destino+nombre1+preescolar+getFile().getFileName()));
}catch (Exception e) {
Logger.getLogger(ManagedBeanFileImagesUpload.class.getName()).log(Level.SEVERE, null, e);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
}
break;
}
}else{
/*sino hay archivo seleccionado manda un mensaje*/
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Error", "No hay archivo seleccionado"));
}
}else{
/*si el archivo no es la extencion que se pide manda un mensaje de error*/
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Error", "Solo con extencion jg"));
}
}
/*metodo para registrar los datos de la imagen asi como el nivel educativo, la ruta de la imagen, las etiquetas que se le dan a la imagen y el año en que se tomaron o se suben al servidor*/
public void registerUser(){
//inicializamos las variables para ocupar con hibernate
this.session = null;
this.transaction = null;
try {
//abrimos sesión
session = HibernateUtil.getSessionFactory().openSession();
//comenzamos la transacción
transaction = session.beginTransaction();
//instan-ciamos el objeto DAO
ResourceDAO rDAO = new ResourceDAO();
//se crear un siwtch y de acuerdo al nivel seleccionado almacena la ruta y el nivel a la BD
switch (getNivel()) {
case "Secundaria":
resource.setRuta(destino+nombre1+secundaria+getFile().getFileName());
resource.setNivel("Secundaria");
break;
case "Media Superior":
resource.setRuta(destino+nombre1+media+getFile().getFileName());
resource.setNivel("Media Superior");
break;
case "Primaria":
resource.setRuta(destino+nombre1+primaria+getFile().getFileName());
resource.setNivel("Primaria");
break;
default:
resource.setRuta(destino+nombre1+preescolar+getFile().getFileName());
resource.setNivel("Preescolar");
break;
}
//accedemos al metodo de registrar con el objeto instan ciado anteriormente
rDAO.registerResource(session, resource);
//se manda mensaje de exito
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos insertados Exitosamente"));
transaction.commit();
resource = new Video();
} catch (Exception e) {
if(transaction != null){
transaction.rollback();
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error Fatal", "Contacte con su administrador "+e.getMessage()));
}finally{
if(session != null){
session.close();
}
}
}
//getters y setters
public UploadedFile getFile() {
return file;
}
public void setFile(UploadedFile file) {
this.file = file;
}
public String getDestino() {
return destino;
}
public void setDestino(String destino) {
this.destino = destino;
}
public Video getResource() {
return resource;
}
public void setResource(Video resource) {
this.resource = resource;
}
public File getCarpeta() {
return carpeta;
}
public void setCarpeta(File carpeta) {
this.carpeta = carpeta;
}
public String getNivel() {
return nivel;
}
public void setNivel(String nivel) {
this.nivel = nivel;
}
public String getDir1() {
return dir1;
}
public void setDir1(String dir1) {
this.dir1 = dir1;
}
public Calendar getFecha() {
return fecha;
}
public void setFecha(Calendar fecha) {
this.fecha = fecha;
}
public String getNombre1() {
return nombre1;
}
public void setNombre1(String nombre1) {
this.nombre1 = nombre1;
}
public String getPreescolar() {
return preescolar;
}
public void setPreescolar(String preescolar) {
this.preescolar = preescolar;
}
public String getPrimaria() {
return primaria;
}
public void setPrimaria(String primaria) {
this.primaria = primaria;
}
public String getSecundaria() {
return secundaria;
}
public void setSecundaria(String secundaria) {
this.secundaria = secundaria;
}
public String getMedia() {
return media;
}
public void setMedia(String media) {
this.media = media;
}
}
la interfaz del dao queda asi:
public interface FrondEndResource {
public boolean registerUsers(Session session, Recurso resource) throws Exception;
}
El dao queda de la siguiente forma implementando el método de la interfaz:
public class RecursoDAO implements FrondEndResource{
@Override
public boolean registerUsers(Session session, Recurso resource) throws Exception {
session.save(resource);
return true;
}
}
el modelo y pojo creados por hibernate queda asi:
public class Video implements java.io.Serializable {
private int id;
private String nivel;
private String anio;
private String etiquetas;
private String ruta;
public Video() {
}
public Video(int id) {
this.id = id;
}
public Video(int id, String nivel, String anio, String etiquetas, String ruta) {
this.id = id;
this.nivel = nivel;
this.anio = anio;
this.etiquetas = etiquetas;
this.ruta = ruta;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getNivel() {
return this.nivel;
}
public void setNivel(String nivel) {
this.nivel = nivel;
}
public String getAnio() {
return this.anio;
}
public void setAnio(String anio) {
this.anio = anio;
}
public String getEtiquetas() {
return this.etiquetas;
}
public void setEtiquetas(String etiquetas) {
this.etiquetas = etiquetas;
}
public String getRuta() {
return this.ruta;
}
public void setRuta(String ruta) {
this.ruta = ruta;
}
}
////////
<hibernate-mapping>
<class name="com.inee.models.Video" table="video" schema="public" optimistic-lock="version">
<id name="id" type="int">
<column name="id" />
<generator class="identity" />
</id>
<property name="nivel" type="string">
<column name="nivel" length="69" />
</property>
<property name="anio" type="string">
<column name="anio" length="25" />
</property>
<property name="etiquetas" type="string">
<column name="etiquetas" length="75" />
</property>
<property name="ruta" type="string">
<column name="ruta" length="2999" />
</property>
</class>
</hibernate-mapping>
la configuracion de postgres con hibernate para la conexion a la BD ya la eh comentado en blogs anteriores y al igual que la ingenieria inversa necesaria y la aplicacion queda asi: