2010-08-06 36 views
14

que es la manera correcta de descargar un archivo usando JSF ?, ¿simplemente poniendo un enlace al archivo? en ese caso, ¿cómo obtengo la URL del archivo?¿Descargue un archivo con JSF?

he visto un ejemplo usando BufferedInputStream:

¿Cuáles son las diferencias?

Gracias

Respuesta

23

Si se trata de un simple archivo, basta con colocar en webcontent pública (hay donde poner los archivos estáticos y JSF) y crear un enlace.

<h:outputLink value="/files/file.ext">link</h:outputLink> 

El servletcontainer se preocupará por aplicar los encabezados correctos.

Si se encuentra fuera de la webcontent pública por algunas razones específicas (por ejemplo, en una trayectoria fija en la máquina servidor, o en una base de datos), a continuación, crear un servlet que recibe un InputStream de él y lo escribe en el OutputStream de la respuesta a lo largo de al menos los encabezados Content-Type, Content-Disposition y Content-Length. Puede encontrar here un simple ejemplo de patada inicial. Además, eso simplemente se puede vincular en el servlet url-pattern.

Si se trata de ser generado de forma dinámica y en función de los parámetros de la petición específica JSF, a continuación, puede también hacerlo en una acción bean gestionado que está obligado por h:commandLink o h:commandButton, pero sólo se necesitará asegurarse de que usted llama FacesContext#responseComplete() al final del método de acción del frijol para evitar que JSF tome la navegación en las manos. El mismo tipo de código de servlet puede reutilizarse para transmitir el archivo. Puede encontrar un ejemplo de kickoff en this answer.

+0

Oo Thx BalusC no pude conectar en todo el fin de semana, pero tengo que agradecerte toda tu ayuda = D Realmente aprecio – ErVeY

+0

De nada. – BalusC

12

que tenía que hacer un código similar al descargar un archivo a través de JSF

Eso es botón de mi descarga en mi página JSF

<h:commandButton value="Download" action="#{helloBean.downloadFile}" /> 

y es mi código de Java

public void downloadFile() { 

    File file = new File("/home/marco/file.txt"); 
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

    response.setHeader("Content-Disposition", "attachment;filename=file.txt"); 
    response.setContentLength((int) file.length()); 
    ServletOutputStream out = null; 
    try { 
     FileInputStream input = new FileInputStream(file); 
     byte[] buffer = new byte[1024]; 
     out = response.getOutputStream(); 
     int i = 0; 
     while ((i = input.read(buffer)) != -1) { 
      out.write(buffer); 
      out.flush(); 
     } 
     FacesContext.getCurrentInstance().getResponseComplete(); 
    } catch (IOException err) { 
     err.printStackTrace(); 
    } finally { 
     try { 
      if (out != null) { 
       out.close(); 
      } 
     } catch (IOException err) { 
      err.printStackTrace(); 
     } 
    } 

} 
+2

¿No debería el método de acción del botón de comando devolver una Cadena? – codingsplash

+0

No es necesario –

-1

tengo tuvo un error en

FacesContext.getCurrentInstance().getResponseComplete(); 

del tipo

java.lang.IllegalStateException: getOutputStream() has already been called for this response 

y lo solucioné: página

JSF:

<h:commandButton action="#{bean.downloadFile}" id="downloadBtn" value="Download"/> 

frijol método:

public void downloadFile(File file) { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); 
    response.setHeader("Content-Disposition", "attachment;filename=file.txt"); 
    response.setContentLength((int) file.length()); 
    FileInputStream input= null; 
    try { 
     int i= 0; 
     input = new FileInputStream(file); 
     byte[] buffer = new byte[1024]; 
     while ((i = input.read(buffer)) != -1) { 
      response.getOutputStream().write(buffer); 
      response.getOutputStream().flush(); 
     }    
     facesContext.responseComplete(); 
     facesContext.renderResponse(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if(input != null) { 
       input.close(); 
      } 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Dije probar porque no tuve tiempo de explicarlo bien y el título de la publicación es [Descargar un archivo con JSF?].Y lo he probado y funciona, así que si no has probado, por favor no cuentes, creo ... –

Cuestiones relacionadas