Vistas de página en total

martes, 30 de diciembre de 2014

Almacenar archivos al servidor y guardar los datos con MySQL y PostgreSQL

Aquí utilizaremos el framework jsf, hibernate, primefaces básicamente sera crear un formulario para que el usuario pueda guardar en este caso una imagen ya que en el proyecto en el cual estoy me piden esto y bueno a mi punto de vista me costo trabajo y que mejor que guardarlo y tenerlo presente jeje.

Como decía se almacenara la imagen en el servidor en la ruta especifica y en este caso los datos se almacenaran en la BD que seria la ruta, nivel educativo, año, y etiquetas para esto primefaces nos facilita de alguna manera esto ok  el formulario que pida la información del archivo ojo son 2 proyectos diferentes

Creamos la configuración de Hibernate en MySQL:

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ejem?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">061090</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.show_sql">true</property>
//esto se genera automaticamente despues de crear los pojos
    <mapping resource="com/davho/models/Recurso.hbm.xml"/>
  </session-factory>
</hibernate-configuration>


Creamos la configuración de Hibernate en PostgreSQL:

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/ejem</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">061090</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.show_sql">true</property>
//esto se genera automaticamente despues de crear los pojos
    <mapping resource="com/davho/models/Video.hbm.xml"/>
  </session-factory>
</hibernate-configuration>


Despues de esto se hace la reingenieria inversa para filtrar las tablas de la BD que vamos a usar que se hace mediante el asistente ok ojo para el postgres el match-schema debe ser publico sino no filtrara las tablas de la BD debe quedar asi match-schema="public"

Despues creamos los pojos de ambos proyectos y se creara tambien los modelos una vez realizado esto en mi caso creo los interfaces para implementarlos en el DAO necesario y deben quedar asi, para ambos:

public interface FrondEndResource {
    public boolean registerResource(Session session, Recurso resource) throws Exception;
}

el Dao para este caso en ambos proyectos seria:

public class RecursoDAO implements FrondEndResource{
    @Override
    public boolean registerUsers(Session session, Recurso resource) throws Exception {
        session.save(resource);
        return true;
    }
   
}


y bueno finalmente el ManagedBean para el caso de MySQL seria asi:

ManagedBean
@RequestScoped
public class ManagedBeanResource{
    private Session session;
    private Transaction transaction;
    private Recurso recurso;
    private String destino = "C:\\INEE\\BankImage\\";
    private UploadedFile file;
    private Recurso resource;
   
    public ManagedBeanResource() {
        recurso = new Recurso();
        recurso.setId(null);
    }
   
    /*metodo para registrar los datos del archivo en la base de datos de MySQL*/
    public void registerUser(){
        /*inicializamos para asegurarnos*/
        this.session = null;
        this.transaction = null;
     
        try {            
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             /*instanciamos los objetos*/
             /*creamos el dao que utilizaremos*/
             RecursoDAO rDAO = new RecursoDAO();
             recurso.setRuta(destino+getFile().getFileName());
             rDAO.registerUsers(session, recurso);
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos insertados Exitosamente"));
             transaction.commit();//cerrar transaccion
             //esta forma limpiamos el formulario sin usar el js
             recurso = new Recurso();
             recurso.setId(null);
        } catch (Exception e) {
            //verificamos sino hay ya una transaccion ya definida
            if(transaction != null){
                //si lo hay haremos que todo se revierta en la BD y que como estaba antes de utilizar este metodo
                transaction.rollback();
            }
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error Fatal", "Contacte con su administrador "+e.getMessage()));
        }finally{
            //verificamos sino hay ya una session ya definida
            if(session != null){
                //si lo hay cerramos la session
                session.close();
            }
        }
     
    }
    /*metodo que sirve para crear el archivo seleccionado mediante un flujo de bytes y almacenarlo en la ruta y con el nombre */
    public void transferir(String fileName, InputStream in) {
        try {
            //creamos el arhivo que saldra de la aplicacion
            OutputStream o = new FileOutputStream(new File(destino + fileName));
            //iniciamos un valor
            int reader = 0;
            //recibimos el tamaño del archivo que se va a crear
            byte[] bytes = new byte [(int) getFile().getSize()];
            //generamos un ciclo while que cree el archivo mientras el tamaño no sea menor a -1 byte
            while((reader = in.read(bytes)) != -1){
                //guardamos o escribimos el archivo
                o.write(bytes, 0, reader);
            }
            in.close();
            o.flush();
            o.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
       
    }
   
    /*metodo encargado de seleccionar el archivo y restringuiendo que solo sea jpg*/
    public void upload() throws Exception {
        //variable de validar extencion
        String txtValidador;
        //condicional si se obtuvo o no un archivo
        if(getFile() != null){
            //si hay archivo guardar el nombre del archivo en una variable
            String ext = getFile().getFileName();
            //si se obtuve o no el nombre del archivo seleccionado
            if(ext != null){
                //si se obtuvo la variable de extencion obtendra mediante un substring del nombre del archivo que despues del (".") seleccione los caracteres
                txtValidador = ext.substring(ext.indexOf(".")+1);
            }else{
                //sino obtuvo el nombre del archivo se le asigna null
                txtValidador = "null";
            }
            //validar si despues del (".") la extencion permitida sea jpg
            if(txtValidador.equals("jpg")){
                //si es asi genereamos un try catch porque accederemos a algo que esta afuera de la maquina virtual de java
                try {
                    //mandamos a llamar el metodo con los parametros de entrada que pide
                    transferir(getFile().getFileName(), getFile().getInputstream());
                //si falla    
                } catch (Exception e) {
                    //mandamos un mensaje de error
                    Logger.getLogger(ManagedBeanResource.class.getName()).log(Level.SEVERE, null, e);
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
                }
             //despues de transferir el archivo mostramos los datos de dicho archivo en un FacesContext para visualizarlo
             FacesContext context = FacesContext.getCurrentInstance();
             context.addMessage(null, new FacesMessage("Exito", "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+getFile().getFileName()));  
            }else{
                //mandar mensaje de error si no se selecciono un jpg
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Error", "Solo archivos con extencion .jpg"));
            }
        }else{
            //mandar mensaje de que no se selecciono ningun archivo
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Error", "No hay archivo seleccionado"));
        }
       
    }
   
    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 Recurso getResource() {
        return resource;
    }
    public void setResource(Recurso resource) {
        this.resource = resource;
    }
   
    public Recurso getRecurso() {
        return recurso;
    }
    public void setRecurso(Recurso recurso) {
        this.recurso = recurso;
    }
}

y el ManagedBean para PostgreSQL seria:

@ManagedBean
@RequestScoped
public class ManagedBeanResource{
    private Session session;
    private Transaction transaction;
    private Video recurso;
    private String destino = "C:\\INEE\\BankImage\\";
    private UploadedFile file;
    private Video resource;
   
    public ManagedBeanResource() {
        recurso = new Video();
    }
   
    public void registerUser(){
        /*inicializamos para asegurarnos*/
        this.session = null;
        this.transaction = null;
     
        try {            
             //abrimos sesion de conexcion
             session = HibernateUtil.getSessionFactory().openSession();
             //creamos la transaccion y la comenzamos
             transaction = session.beginTransaction();
             /*instanciamos los objetos*/
             /*creamos el dao que utilizaremos*/
             RecursoDAO rDAO = new RecursoDAO();
             recurso.setRuta(destino+getFile().getFileName());
             rDAO.registerUsers(session, recurso);
             FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Datos insertados Exitosamente"));
             transaction.commit();//cerrar transaccion
             //esta forma limpiamos el formulario sin usar el js
             recurso = new Video();
        } catch (Exception e) {
            //verificamos sino hay ya una transaccion ya definida
            if(transaction != null){
                //si lo hay haremos que todo se revierta en la BD y que como estaba antes de utilizar este metodo
                transaction.rollback();
            }
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Error Fatal", "Contacte con su administrador "+e.getMessage()));
        }finally{
            //verificamos sino hay ya una session ya definida
            if(session != null){
                //si lo hay cerramos la session
                session.close();
            }
        }
     
    }
   
     /*metodo que sirve para crear el archivo seleccionado mediante un flujo de bytes y almacenarlo en la ruta y con el nombre */
    public void transferir(String fileName, InputStream in) {
        try {
            //creamos el arhivo que saldra de la aplicacion
            OutputStream o = new FileOutputStream(new File(destino + fileName));
            //iniciamos un valor
            int reader = 0;
            //recibimos el tamaño del archivo que se va a crear
            byte[] bytes = new byte [(int) getFile().getSize()];
            //generamos un ciclo while que cree el archivo mientras el tamaño no sea menor a -1 byte
            while((reader = in.read(bytes)) != -1){
                //guardamos o escribimos el archivo
                o.write(bytes, 0, reader);
            }
            in.close();
            o.flush();
            o.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
       
    }
   
    /*metodo encargado de seleccionar el archivo y restringuiendo que solo sea jpg*/
    public void upload() throws Exception {
        //variable de validar extencion
        String txtValidador;
        //condicional si se obtuvo o no un archivo
        if(getFile() != null){
            //si hay archivo guardar el nombre del archivo en una variable
            String ext = getFile().getFileName();
            //si se obtuve o no el nombre del archivo seleccionado
            if(ext != null){
                //si se obtuvo la variable de extencion obtendra mediante un substring del nombre del archivo que despues del (".") seleccione los caracteres
                txtValidador = ext.substring(ext.indexOf(".")+1);
            }else{
                //sino obtuvo el nombre del archivo se le asigna null
                txtValidador = "null";
            }
            //validar si despues del (".") la extencion permitida sea jpg
            if(txtValidador.equals("jpg")){
                //si es asi genereamos un try catch porque accederemos a algo que esta afuera de la maquina virtual de java
                try {
                    //mandamos a llamar el metodo con los parametros de entrada que pide
                    transferir(getFile().getFileName(), getFile().getInputstream());
                //si falla    
                } catch (Exception e) {
                    //mandamos un mensaje de error
                    Logger.getLogger(ManagedBeanResource.class.getName()).log(Level.SEVERE, null, e);
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Error","No se subio el archivo"));
                }
             //despues de transferir el archivo mostramos los datos de dicho archivo en un FacesContext para visualizarlo
             FacesContext context = FacesContext.getCurrentInstance();
             context.addMessage(null, new FacesMessage("Exito", "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+getFile().getFileName()));  
            }else{
                //mandar mensaje de error si no se selecciono un jpg
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Error", "Solo archivos con extencion .jpg"));
            }
        }else{
            //mandar mensaje de que no se selecciono ningun archivo
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Error", "No hay archivo seleccionado"));
        }
       
    }
   
    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 Video getRecurso() {
        return recurso;
    }
    public void setRecurso(Video recurso) {
        this.recurso = recurso;
    }
   
}





No hay comentarios:

Publicar un comentario