Descargar archivo con JSF, Primefaces, Hibernate.

FileDownload

FileDownload se utiliza para transmitir contenido binario como archivos almacenados en la base de datos para el cliente. FileDownload es utilizado por conectarlo a cualquier componente de comandos JSF como botón o un enlace. Adicionalmente presentación de descarga puede estar configurado con el atributo contentDisposition que tiene ya sea "unión" o "en línea" como un valor.

FileDownload is used to stream binary contents like files stored in database to the client. FileDownload is used by attaching it to any JSF command component like button or a link. Additionally presentation of download can be configured with the contentDisposition attribute that takes either "attachment" or "inline" as a value.


Descargar archivos con FileDownload. Primefaces. Jsf.

Hace algunos días estuve investigando como descargar un archivo alojando en cualquier parte, ya sea servidor de archivo, servidor remoto, entro otros, pero no encontraba como hacerlo, solo encontraba fracciones de códigos que me daban pistas de como hacerlo. Probé muchas opciones y no me funcionaba ninguna, de alguna forma encontré un pedazo de código que fue el que me saco de duda y pude lograr solucionar el problema. Veamos.

Se va a realizar un ejemplo donde se descargará un archivo (pdf, xls, csv, otro) utilizando la ruta exacta de su ubicación para así descargarlo.

Se tiene el siguiente código del Bean: 


import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.DefaultStreamedContent;

/**
 *
 * @author José Mejía
 */
public class Bean_Filemanagemen {

    /**
     * Creates a new instance of Bean_Filemanagemen
     */
    private DefaultStreamedContent download;
    public Bean_Filemanagemen() {
    }
    
    public void setDownload(DefaultStreamedContent download) {
    this.download = download;
}

public DefaultStreamedContent getDownload() throws Exception {
    return download;
}

public void prepDownload(String date) throws Exception {
  File file = new File(date);
  InputStream input = new FileInputStream(file);
  ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
  setDownload(new DefaultStreamedContent(input, externalContext.getMimeType(file.getName()), file.getName()));
}
}

El método prepDownload recibe un parametro que es la ruta exacta del archivo, ejemplo: C:\Chat\file.csv y esa debe ser la ruta donde esta alojado, ubicado el archivo que se desea descargar.

El archivo xhtml debe contener el siguiente fragmento de código:


<p:dataTable id="archivos" 
styleClass="tablaDatos" 
var="archivo" 
value="#{bean_Seguimiento.sisgiArchivosL}"
editable="true"
emptyMessage="No hay cronogramas"
paginator="true" 
paginatorPosition="bottom"
paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
rows="10" 
rowsPerPageTemplate="5,10,#{bean_Seguimiento.sisgiArchivosL.size()}">
<f:facet name="header">
Proyectos encontrados
</f:facet>

<p:ajax event="rowEdit" listener="#{bean_Seguimiento.onRowEdit}" update=":form_seguimiento:messages,archivos" />
<p:ajax event="rowEditCancel" listener="#{bean_Seguimiento.onRowCancel}" update=":form_seguimiento:messages,archivos" />

<p:column headerText="Nombre">
<h:outputText value="#{archivo.nombre}" />
</p:column>

<p:column headerText="Ruta">
<h:form>
<p:commandButton id="downloadLink" value="Descargar" ajax="false" actionListener="#{bean_Filemanagemen.prepDownload(archivo.ruta)}">
<p:fileDownload value="#{bean_Filemanagemen.download}" />
</p:commandButton>
</h:form>

</p:column>
<p:column headerText="Editar" style="width:32px">
<p:rowEditor />
</p:column>

</p:dataTable>

Un CommandButton que ejecutará el evento de descarga del archivo. Si se dan cuenta el commandbutton (ActionListener) contiene la siguiente fracción: actionListener="#{bean_Filemanagemen.prepDownload(archivo.ruta)}" donde al método preDownload le pasamos un parametro que contiene la ruta del archivo que se desea descargar y el ajax en false, para no refrescar la página completa. Despues de todo esto éste código utiliza la ultima ruta de descarga que halla tenido el usuario y en abre un choose para descargar. Así mismo como utilizo un commandButton, tambien se puede utilizar un commandLink.

Descargar Archivos con FileDownload. Primefaces.







Descargar Archivos con FileDownload. Primefaces.




Entradas más populares de este blog

Crear un dominio en servidor Glassfish. create-domain. start-domain.

Internet gratis para android. 100 mb diarios. DROIDVPN, TUN.KO