Vistas de página en total

miércoles, 11 de febrero de 2015

Mostrar las imagenes que almacenamos en la DB con un dataGrid de Primefaces

Primero que nada deberan haber revisado el post de subir imagenes al servidor con primefaces almacenando la ruta en la BD para poder mostrarla, primero que nada me costo trabajo hacer que se muestren las imagenes ya que no las tengo en el proyecto almacenadas sino en el disco duro necesitamos crear el archivo en este caso la imagen con una clase que extienda de HttpServlet para pasarle un parametro que contrenda la ruta de la imagen que queremos mostrar y con esa ruta que cree la imagen para su visualizacion.

En una variable String almacenamos la ruta del archivo mediente un parametro:

String file = request.getParameter("file");

Mediante un BufferedInputStream que crea una matriz indefinida a medida que lee los bytes de flujo de la imagen que se mostrara y mediante el FileInputStream que se encarga de crear el objeto o la imagen en este caso, retomamos lo que trate de decir haremos que se cree la imagen y despues que se obtengan los bytes para luego mostrarlo en el dataGrid que se encarga de cargarlo mediente los byte, recordemos que el file que recibe es del string que obtiene la ruta completa de la imagen y la linea quedaria asi:

 BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));

Esto solo fue para obtener la imagen de la ruta ahora vamos a contener el contenido en este caso el tamaño que se lee en bytes que esta almacenada en la variable "in" de BufferedInputStream, crearemos un arreglo de bytes y le pasamos los bytes de la imagen seleccionada al arreglo mediente el metodo available que devuelve una estimación del número de bytes que se pueden leer de este flujo de entrada sin bloquear por la siguiente invocación de un método para el flujo de entrada. Despues leemos los bytes y cerramos el codigo seria de esta forma:

byte[] bytes = new byte[in.available()];
 in.read(bytes);
 in.close();

Por ultimo escribimos en el Response de HttpServlet para escribirlo o en este caso mostrar la imagen:

 response.getOutputStream().write(bytes);

  El codigo de la clase la muestro a continuacion:

public class DynamicImageServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        try {


            // Obtenemos la imagen
            String file = request.getParameter("file");
            System.out.println("Ruta-->" + file);
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
            

            // Obtenemos el contenido de la imagen
            byte[] bytes = new byte[in.available()];
            in.read(bytes);
            in.close();
            

            // Escribimos el contenido de la imagen
            response.getOutputStream().write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


Y en nuestro xhtml donde vayamos a mostrar las imagenes pondriamos en nuestro dataGrid el valor de donde obtendra la imagen en mi caso es una lista ya que puede haber mas de una imagen en mi BD el metodo para obtener todos las rutas de las imagenes la debemos tener en el ManagedBean declaramos la variable de tipo List del mismo tipo de la Clase donde estan las imagenes almacenadas en la BD:

private List<Imagen> listResource;

y agregamos los getters y setters:

public List<Imagen> getListResource() {
        return listResource;
    }

    public void setListResource(List<Imagen> listResource) {
        this.listResource = listResource;
    }


Y nuestra lista se manda como valor en el DataGrid, en la parte de p:graphicImage se manda el valor de la imagen "images/dynamic/?file" en donde file es el parametro donde creamos la clase que puse anteriormente

<p:dataGrid var="mag" value="#{managedBeanViewResources.listResource}" columns="6" rows="12" paginator="true" id="dataResource" paginatorTemplate="{CurrentPageReport}  {FirstPageLink}{PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  rowsPerPageTemplate="12,16,20" lazy="true" emptyMessage="Ninguna Imagen encontrada" >
                        <f:facet name="header">
                            Banco de imagenes
                        </f:facet>
                            <h:panelGrid columns="1" style="padding: 5px;">
                                <p:commandLink update=":formListAll:resourceDetail" oncomplete="PF('resourceDialog').show()" title="Imagen">
                                    <p:graphicImage id="listImagen" value="images/dynamic/?file=#{mag.ruta}" rendered="#{mag.ocultar == 'No'}" style="height: 150px; width: 205px"/>
                                    <f:setPropertyActionListener value="#{mag}" target="#{managedBeanViewResources.resource}" />
                                </p:commandLink>
                            </h:panelGrid>
                    </p:dataGrid>


martes, 6 de enero de 2015

FileUpload de primefaces con jsf, Hibernate y postgresSQL

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:






Crear una carpeta elijiendo la ruta especifica en Java

Hola hoy retomare un poco lo del blog anterior de crear carpeta en aquel ejemplo se creo la carpeta dentro del mismo formulario hoy haré lo mismo con la diferencia de que se creara de acuerdo a la ruta que le demos ok, así que no explicare nada ya que lo explicado este en el blog anterior solo daré el código:

Crearemos una carpeta que contendra dentro de ella otras carpetas de acuerdo y la llamare a la carpeta principal de acuerdo al año en el que estamos:

public static void main(String[] args) {
        Calendar fecha = Calendar.getInstance();
        int año = fecha.get(Calendar.YEAR);
        String nombre1 = Integer.toString(año);
        File carpeta, carpeta1, carpeta2, carpeta3, carpeta4;
        //variable
        //String nombre;
        //le asignamos un valor a la variable nombre para la carpeta mediante JOptionPane que muestre una ventana
        //nombre = JOptionPane.showInputDialog("Nombre a la Carpeta");
        //se instancia la carpeta y se le asgina el nombre
        carpeta = new File("C:\\Users\\dell 6410\\Desktop\\" + nombre1);
        //se verifica si la carpeta existe o no y la crea en caso de que no exista  
            carpeta1 = new File(carpeta + "\\Pre-escolar");
            carpeta2 = new File(carpeta + "\\Primaria");
            carpeta3 = new File(carpeta + "\\Secundaria");
            carpeta4 = new File(carpeta + "\\Media Superior");
            carpeta1.mkdir();
            carpeta2.mkdir();
            carpeta3.mkdir();
            carpeta4.mkdir();
            String dir = carpeta1.getPath();
            System.out.println(carpeta.getPath());
        System.out.println(dir);
        System.out.println(carpeta2.getPath());
        System.out.println(carpeta3.getPath());
        System.out.println(carpeta4.getPath());    
    }


Como se ve en la consola de salida de Netbeans mande a imprimir la direccion de las carpetas creadas:


Verificamos que se haya creado y las demás también: