Desarrollo WEB.


Las practicas de programación orientadas a la web son muy cambiantes en el tiempo. Es necesario conocer e implementar tecnologías, conocer lenguajes,integrar comunidades,usar Ides, etc, recientes, para responder al mercado que se acerca.

domingo, 11 de agosto de 2013

Upload de archivos en una aplicación web con JSF 2.0

Upload con JSF 2.0
  • Carpeta destino
Es importante tener una carpeta definida en el contexto de la aplicación para crear los archivos subidos por el recurso java de fileupload y primefaces en jsf 2.0
nuestro directorio destino se encuentra en /modulos/rh/rhEmpleadoFoto/fotos

  • En el .xhtml

<h:form enctype="multipart/form-data" id="formfileupload" prependid="false">
     <!--aca neustro componente se ejecuta automaticamente apenas recibe el archivo-->
            <p:fileupload actualiza="" allowtypes="/(\.|\/)(gif|jpe?g|png)$/" auto="true" cancellabel="Cancelar" componente="" donde="" dragdropsupport="true" fileuploadlistener="#{rhEmpleadoFotoController.accionFileUpload}" foto="" grafico="" id="fileupload" imagen="" la="" label="Seleccionar" mi="" mode="advanced" rendered="true" renderiza="" se="" sizelimit="1000000" update=":formpersonal:idRhEmpleadoFoto" uploadlabel="Subir al servidor" xhtml="">
            </p:fileupload> 
            <!--
  para tener donde visualizar la imagen despues de ingresarse.
                El nombre en el contexto de la aplicacion para mi controlador es rhEmpleadoFotoController 
                -->
        <p:graphicimage cache="false" height="300" id="imagemTmp" style="margin: 0 auto;" value="#{rhEmpleadoFotoController.imagem}">
</p:graphicimage></h:form>
En nuestro xhtml ingresamos el anterior codigo, lo adaptamos de acuerdo al framework que estemos usando en mi caso primefaces.
  • Controlador
En el cuerpo de mi controlador ingreso estas funciones teniendo en cuenta que algunas propiedades se deben declarar como privadas en el controlador y se les debe crear métodos accesores y colocadores para que sean accedidos desde otros ámbitos de la aplicación en las .xhtml(UI)
    
public void accionFileUpload(FileUploadEvent event) { //evento propio del framework
        try {
            file = event.getFile();
            byte[] foto = event.getFile().getContents();
            String nomeArquivo = event.getFile().getFileName();
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            String archivo = scontext.getRealPath("/modulos/rh/rhEmpleadoFoto/fotos/" + nomeArquivo); //guardar en ruta basica para luego mover
            crearArchivo(foto, archivo);
            imagem = new DefaultStreamedContent(event.getFile().getInputstream()); //agregar geter y seter para poder ser accedida desde otros xhtml
            
            selectedEntidad = new RhEmpleadoFoto(); //entidad para persistir en la base de datos
            selectedEntidad.setNombre(nomeArquivo);
            selectedEntidad.setIdRhEmpleado(idRhEmpleado);
            long peso = event.getFile().getSize();
            int x = (int) peso;
            selectedEntidad.setPeso(x);
            selectedEntidad.setRuta("/modulos/rh/rhEmpleadoFoto/fotos");
            selectedEntidad.setLlaveUnica(GenerarRandom().toString());
            selectedEntidad.setEstadoEliminado(Boolean.FALSE);
            getFacade().create(selectedEntidad); //crea el objeto(RhEmpleadoFoto) en la bd

     //dos objetos para hacer renombrado de archivo y copiado a carpetas
            RhEmpleadoFoto current = ejbFacade.findObjeto(selectedEntidad);
            RhEmpleadoFoto current2 = new RhEmpleadoFoto();
            RhEmpleadoFoto current2 = ejbFacade.findObjeto(selectedEntidad);
            
            
            if (renombrarArchivo(current2.getRuta() + "/" + current2.getNombre(), current2.getRuta() + "/" + (idRhEmpleado.getIdRhEmpleado() + ""))) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "Ingreso Exitoso"));
            } else {
                if (renombrarArchivo(current2.getRuta() + "/" + current2.getNombre(), current2.getRuta() + "/" + (idRhEmpleado.getIdRhEmpleado() + ""))) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "Ingreso Exitoso")); //para enviar el mensaje a la growl del framework
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje:", "" + current2.getRuta() + "/" + current2.getNombre() + " " + current2.getRuta()));
                }
            }

            recreateModel();
            FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " Fue Cargado Exitosamente.");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            //cerrarPanelFoto(); //una funcion booleana para renderizar el contenido en el xhtml de acuerdo a lo sucedido
        } catch (Exception ex) {
            Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex.getMessage());
            FacesMessage msg = new FacesMessage("Succesful", file.getFileName() + " Error en la carga:" + ex.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
    
     /**
     * Funcion para mover y renombrar un archivo
     *
     * @param String archivo Archivo o directorio a renombrar
     * @param String directorio Directorio destino
     * @exception RCException Se genera una excepción genérica.
     * @return boolean
     */
    public boolean renombrarArchivo(String archivo, String directorio) {
        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            String Sarchivo = scontext.getRealPath(archivo);
            File archivos = new File(Sarchivo);
            String Sdirectorio = scontext.getRealPath(directorio);
            File dir = new File(Sdirectorio);
            String name = archivos.getName();
            int j = name.indexOf(".");
            String newname = "" + GenerarRandom() + "" + name.substring(j, name.length());
            boolean semovio = archivos.renameTo(new File(dir, newname));
            if (!semovio) {
                System.out.print("El archivo no se ha Movido ...");
                return false;
            } else {
                current.setNombre(newname);
                current.setRuta("/modulos/rh/rhEmpleadoFoto/fotos/" + idRhEmpleado.getIdRhEmpleado()); //una carpeta con el id del objeto que lo contiene, en mi caso empleado
                ejbFacade.edit(current);
                System.out.print("Se Movio ...");
                return true;
            }
        } catch (Exception e) {
            System.out.print("" + e.getMessage());
            return false;
        }
    }

     /**
     * Funcion para crear un archivo
     *
     * @param byte[] bytes objeto
     * @param String archivo archivo
     * @exception RCException Se genera una excepción genérica.
     * @return void
     */
    
    public void crearArchivo(byte[] bytes, String archivo) {
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(archivo);
            fos.write(bytes);
            fos.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(IngenieriaProductoImagenController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  • Web.xml
Anexar estas lineas al archivo de configuración de la aplicación web, pero depende del framework usado, en mi caso primefaces.
   <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> //de mi framework
        <init-param>
            <param-name>thresholdSize</param->
<!--tamaño maximo de los archivos para el contexto de la aplicacion-->
            <param-value>512000</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    <filter>
        <mime-mapping>
        <extension>png</extension>
        <mime-type>image/png</mime-type>
    </mime-mapping>
  •  Librerías 
 usar la librería commons-fileupload-1.2.2.jar y sus librerías dependientes

 Para una opcion mas clara en lenguaje nativo descargue este ejemplo. >>

No hay comentarios:

Publicar un comentario