JSF - fazendo um link para download

Ola galera !
Alguem sabe se no JSF existe uma tag para fazer download de um arquivo do servidor ?
Eu criei um dataTable que lista os arquivos no servidor, mas o cliente precisa fazer download desses arquivos.
Caso nao exista uma forma facil atraves do JSF existe uma outra forma ?

Desde já muito obrigado.

Vc é o acreano que eu conheço?
(rs)

é só fazer um outputLink com o endereço do arquivo (isso se ele está após a raiz do projeto)

se o arquivo estiver em um diretório do servidor, mas fora do servidor de aplicação e do projeto, aconselho a fazer um servlet e chamar ele com um outputLink da mesma forma.

mas como ficaria esse servlet ??? :smiley:

também estou com essa dúvida…
=/

Eae … bom … deps de uma boaaa … pesquisa … eu to postando o codigo aki ! :smiley:


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;

public class OperacoesArquivos {
 
    public static synchronized void downloadFile(String filename, String fileLocation, String mimeType,
                                                 FacesContext facesContext) {
 
        ExternalContext context = facesContext.getExternalContext(); // Context
        String path = fileLocation; // Localizacao do arquivo
        String fullFileName = path + filename;
        File file = new File(path); // Objeto arquivo mesmo :)
 
        HttpServletResponse response = (HttpServletResponse) context.getResponse();
        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload
        response.setContentLength((int) file.length()); // O tamanho do arquivo
        response.setContentType(mimeType); // e obviamente o tipo
 
        try {
            FileInputStream in = new FileInputStream(file);
            OutputStream out = response.getOutputStream();

            byte[] buf = new byte[(int)file.length()];
            int count;
            while ((count = in.read(buf)) >= 0) {
                out.write(buf, 0, count);
            }
            in.close();
            out.flush();
            out.close();
        facesContext.responseComplete();
        } catch (IOException ex) {
            System.out.println("Error in downloadFile: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}//By Caio Rodrigo Paulucci

eh issu ai pessoal … adaptem e divirtam - se !!! q q coisa me avisem :smiley:

opaa…
vlw aí cara…
mas eu ainda estou com uma dúvida …
em um projeto usando JSF … como eu faria para ao clicar em um link … iniciar o download de um arquivo ?
você poderia me dar um exemplo ?

vlw

por exemplo …

Eu uso webui …vc adapta issu deps :smiley:

<webuijsf:hyperlink id="download" text="Download" actionExpression="#{download$download.bDownloadAction}">
   <f:param name="id" value="#{row.value['idStr']}"></f:param>
</webuijsf:hyperlink>

Java :

public String bDownloadAction(){
        String codigo = ((HttpServletRequest)this.getFacesContext().getExternalContext().getRequest()).getParameter("id");
        if (codigo!= null){
            StatusUpload statusUpload = this.getUploadRemote().getStatusById(Integer.parseInt(codigo));
            FileOperations.downloadFile("retorno"+statusUpload.getNomeArquivo(), statusUpload.getLocalizacaoDownload(), "application/x-download",getFacesContext());
        }
        return null;
    }

eh mais ou menos por ai … flw !

Aeee…
Descobri como fazer …
fiz assim:

[code]<h:commandLink value=“Download” action="#{teste.download}" immediate=“true” />

public void download() {
OperacoesArquivos.downloadFile(“nomeArquivo”,“caminhoArquivo”,“txt”,FacesContext.getCurrentInstance());
}[/code]

boa ghzatomic, seu código me ajudou bastante. vlw.

fala galera…
tentei utilizar os códigos de vcs aqui no meu projeto, mas quando clico no botão aparece uma página, no browser, como se tivesse exibindo o pdf como página web, não consigo entender. Queria que aparecesse a janela de download.
Alguém tem idéia do que pode está acontecendo?
Grato pela ajuda

Se precisar fazer este arquivo sumir da lista depois da geração do download??? Até agora não consegui fazer, nem sei se é possível…

Colegas, eu utilizei o exemplo e havia um pequeno erro,

Na linha : File file = new File(path); // Objeto arquivo mesmo :) 

Deve ser: File file = new File(fullFileName); // Objeto arquivo mesmo :) 

E no meu managerbean criei o seguinte método:

    public String download(){
        
        OperacoesArquivos.downloadFile("teste.txt", "/teste/", "txt", FacesContext.getCurrentInstance());
        // deve ser passado o nome do arquivo+extensão  teste.txt   
        
        return "gotoDownload";
        
    }
    

Depois é só chamar na página:

<h:commandLink value="Download" action="#{LoginFace.download}" immediate="true" />

Segue o código completo novamente:

 import java.io.File;  
 import java.io.FileInputStream;  
 import java.io.IOException;  
 import java.io.OutputStream;  
 import javax.faces.context.ExternalContext;  
 import javax.faces.context.FacesContext;  
 import javax.servlet.http.HttpServletResponse;  
   
 public class OperacoesArquivos {  
   
     public static synchronized void downloadFile(String filename, String fileLocation, String mimeType,  
                                                  FacesContext facesContext) {  
   
         ExternalContext context = facesContext.getExternalContext(); // Context  
         String path = fileLocation; // Localizacao do arquivo  
         String fullFileName = path + filename;  
         File file = new File(fullFileName); // LINHA ALTERADA  
   
         HttpServletResponse response = (HttpServletResponse) context.getResponse();  
         response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload  
         response.setContentLength((int) file.length()); // O tamanho do arquivo  
         response.setContentType(mimeType); // e obviamente o tipo  
   
         try {  
             FileInputStream in = new FileInputStream(file);  
             OutputStream out = response.getOutputStream();  
   
             byte[] buf = new byte[(int)file.length()];  
             int count;  
             while ((count = in.read(buf)) >= 0) {  
                 out.write(buf, 0, count);  
             }  
             in.close();  
             out.flush();  
             out.close();  
         facesContext.responseComplete();  
         } catch (IOException ex) {  
             System.out.println("Error in downloadFile: " + ex.getMessage());  
             ex.printStackTrace();  
         }  
     }  
 }

ghzatomic, valew pela ajuda.

Abraços.

Pessoal tentei usar essa ajuda para conseguir baixar arquivo pdf, exe, rar ou zip mas nao deu certo. Fiz exatamente como o exemplo. Ele chama a tela de download com nome do arquivo mas baixa com 0 bytes. Tentei tanto com pdf, exe quando zip. O será que pode estar acontendo.

 <h:commandLink value="Download" action="#{teste.download}" immediate="true" />     
 public void download() {  
     OperacoesArquivos.downloadFile("nomeArquivo","caminhoArquivo","txt",FacesContext.getCurrentInstance());  
 }

Galera como eu faria para passar parametros para esse método download ?
Gostaria de passar para ele o nome do arquivo etc.

Perdoem a pergunta simples, sou novato com jsf.

Consegui passar os parâmetros com o seguinte código !
A lista de item é do tipo File !

<h:form id="arquivos">
                <rich:scrollableDataTable  id="DataTableScrool" value="#{download.lista}" var="item"
                                           frozenColCount="0"
                                           first="0"
                                           rows="40"
                                           width="300px"
                                           height="396px">
                    <rich:column width="50px">
                        <f:facet name="header" >
                            <h:outputText value="Download"/>
                        </f:facet>
                        <h:outputLink value="download">
                            <h:outputText value="Download"/>
                            <f:param name="fileName" value="#{item.getName()}" />
                            <f:param name="fileLocation" value="#{item.getAbsolutePath()}" />
                        </h:outputLink>
                    </rich:column>
                    <rich:column width="250px">
                        <f:facet name="header" >
                            <h:outputText value="Arquivo"/>
                        </f:facet>
                            <h:outputText value="#{item.getName()}">
                                <a4j:support event="onclick" reRender="DataTableScrool"/>
                            </h:outputText>
                    </rich:column>
                </rich:scrollableDataTable>
            </h:form>

Só que na url aparecem os parâmetros.
Teria como passar parâmetros assim via post ?

Esse é o codigo do meu servlet que esta mapeado como download !

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String fileName = request.getParameter("fileName");
        String fileLocation = request.getParameter("fileLocation");
        System.out.println("Saida: " + fileName + " --- " + fileLocation);

        File file = new File(fileLocation);
        response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
        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();
            }
        } catch (IOException err) {
            err.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException err) {
                err.printStackTrace();
            }
        }
    }

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

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);

    }

alguem resolveu esse problema? O meu está dando o seguinte erro. Ja tentei C:\ e C:/


20:16:06,468 INFO  [STDOUT] Error in downloadFile: C:\Outlook\teste.txt (O sistema não pode encontrar o arquivo especificado)
20:16:06,468 ERROR [STDERR] java.io.FileNotFoundException: C:\Outlook\teste.txt (O sistema não pode encontrar o arquivo especificado)
20:16:06,468 ERROR [STDERR] 	at java.io.FileInputStream.open(Native Method)
20:16:06,468 ERROR [STDERR] 	at java.io.FileInputStream.<init>(Unknown Source)
20:16:06,468 ERROR [STDERR] 	at br.com.getnet.filedownload.OperacoesArquivos.downloadFile(OperacoesArquivos.java:27)
20:16:06,468 ERROR [STDERR] 	at br.com.getnet.filedownload.OperacoesArquivos.download(OperacoesArquivos.java:49)
20:16:06,468 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
20:16:06,468 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
20:16:06,468 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
20:16:06,468 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Unknown Source)
20:16:06,468 ERROR [STDERR] 	at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
20:16:06,468 ERROR [STDERR] 	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
20:16:06,468 ERROR [STDERR] 	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
20:16:06,468 ERROR [STDERR] 	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
20:16:06,468 ERROR [STDERR] 	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
20:16:06,468 ERROR [STDERR] 	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:409)
20:16:06,468 ERROR [STDERR] 	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:101)
20:16:06,468 ERROR [STDERR] 	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
20:16:06,468 ERROR [STDERR] 	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
20:16:06,468 ERROR [STDERR] 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
20:16:06,468 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:16:06,468 ERROR [STDERR] 	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
20:16:06,468 ERROR [STDERR] 	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
20:16:06,468 ERROR [STDERR] 	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
20:16:06,468 ERROR [STDERR] 	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
20:16:06,468 ERROR [STDERR] 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
20:16:06,468 ERROR [STDERR] 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
20:16:06,468 ERROR [STDERR] 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
20:16:06,468 ERROR [STDERR] 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
20:16:06,468 ERROR [STDERR] 	at java.lang.Thread.run(Unknown Source)
20:16:11,140 INFO  [STDOUT] Error in downloadFile: C:\Outlook\teste.txt (O sistema não pode encontrar o arquivo especificado)
20:16:11,140 ERROR [STDERR] java.io.FileNotFoundException: C:\Outlook\teste.txt (O sistema não pode encontrar o arquivo especificado)
20:16:11,140 ERROR [STDERR] 	at java.io.FileInputStream.open(Native Method)
20:16:11,140 ERROR [STDERR] 	at java.io.FileInputStream.<init>(Unknown Source)
20:16:11,140 ERROR [STDERR] 	at br.com.getnet.filedownload.OperacoesArquivos.downloadFile(OperacoesArquivos.java:27)
20:16:11,140 ERROR [STDERR] 	at br.com.getnet.filedownload.OperacoesArquivos.download(OperacoesArquivos.java:49)
20:16:11,140 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
20:16:11,140 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
20:16:11,140 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
20:16:11,140 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Unknown Source)
20:16:11,140 ERROR [STDERR] 	at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
20:16:11,140 ERROR [STDERR] 	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
20:16:11,140 ERROR [STDERR] 	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
20:16:11,140 ERROR [STDERR] 	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
20:16:11,140 ERROR [STDERR] 	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
20:16:11,140 ERROR [STDERR] 	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
20:16:11,140 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
20:16:11,140 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
20:16:11,140 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
20:16:11,140 ERROR [STDERR] 	at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:409)
20:16:11,140 ERROR [STDERR] 	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:101)
20:16:11,140 ERROR [STDERR] 	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
20:16:11,156 ERROR [STDERR] 	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
20:16:11,156 ERROR [STDERR] 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:16:11,156 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
20:16:11,156 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
20:16:11,156 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
20:16:11,156 ERROR [STDERR] 	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:16:11,156 ERROR [STDERR] 	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
20:16:11,156 ERROR [STDERR] 	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
20:16:11,156 ERROR [STDERR] 	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
20:16:11,156 ERROR [STDERR] 	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
20:16:11,156 ERROR [STDERR] 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
20:16:11,156 ERROR [STDERR] 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
20:16:11,156 ERROR [STDERR] 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
20:16:11,156 ERROR [STDERR] 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
20:16:11,156 ERROR [STDERR] 	at java.lang.Thread.run(Unknown Source)

Você não pode apontar direto para o arquivo se é o que tentou. Você tem que ler o arquivo la no servidor via inputStream e então gravar no outputStream do servlet !!

[quote=ronildobraga]Ola galera !
Alguem sabe se no JSF existe uma tag para fazer download de um arquivo do servidor ?
Eu criei um dataTable que lista os arquivos no servidor, mas o cliente precisa fazer download desses arquivos.
Caso nao exista uma forma facil atraves do JSF existe uma outra forma ?

Desde já muito obrigado.[/quote]

Fiz algo semelhante, porém, o arquivo que precisava fazer download era gerado pela própria aplicação e armazanada em uma pasta no servidor. Criei um arquivo jsp puro e na página jsf da aplicação criei um link que passa como parâmetro para a página JSP o nome e endereço do arquivo:
Arquivo JSP:

<%@ page language=“java” import=“java.io.*” errorPage="" %>
<%
String nomeArquivo = request.getParameter(“nomeArquivo”);
File f = new File(nomeArquivo);
response.reset();
response.setContentType(“application/text”);
response.setHeader(“Content-disposition”,“attachment; filename=” + f.getName());
FileInputStream input = new FileInputStream(f);
InputStream in = new FileInputStream(f);
BufferedInputStream bin = new BufferedInputStream(in);
DataInputStream din = new DataInputStream(input);
while(input.available() > 0){
response.getOutputStream().write(input.read());
}
in.close();
bin.close();
din.close();
response.getOutputStream().flush();
%>

Link da página JSF que faz a chamada ao arquivo JSP:
Download
Isso é uma ganbiarra, mas funciona…

Veja se te serve!

Divino.

fiz uma implementação e um post sobre isso tem exemplo la do projeto para baixar

http://brunodanielmarinho.wordpress.com/2011/08/26/download-de-arquivos-do-servidor/

Diabo eu testei sua aplicação e realmente funciona mas como eu faria se o aquivo fosse gerado em tempo de execução, e não fica-se na pasta web?

Ou tem como em tempo de execução gravar o arquivo no .war?