JSF - fazendo um link para download

22 respostas
R

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.

22 Respostas

R

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.

G

mas como ficaria esse servlet ??? :smiley:

B

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

G

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:

B

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

G

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 !

B

Aeee..
Descobri como fazer ...
fiz assim:

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

public void download() {
         OperacoesArquivos.downloadFile("nomeArquivo","caminhoArquivo","txt",FacesContext.getCurrentInstance());
}
T

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

A

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

J

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…

T

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.

F

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.

S
<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.

S

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);

    }
R

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)
S

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 !!

D

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.

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=<a href="http://java.io">java.io</a>.* 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.

D

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/

J

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?

D

Pegando como base a solução do post o que ele faz basicamente é pegar um arquivo no disco>ler e colocar no outputstream.

Então se vc quer gerar dinamicamente voce deve gerar o arquivo e em vez de gravar ele no disco… vc grava direto no outputstream.

No meu caso eu gerava um excel do banco de dados e gravava na hd depois lia ele e mandava para o usuario.

A solução foi gerar o excel e escrever ele direto em um ByteArrayOutputstream em vez de escrever na hd, o ByteArrayOutputStream tem um metodo toByteArray que pode ser enviado ao usuário se vc modificar levemente o o codigo do post retirando todo codigo que faz a leitura do arquivo e transforma ele em um array de bytes antes de devolver para o usuário.

J

È você está correto, analisei o código novamente e é isto mesmo :oops:

F

Valeu !!! tap_pedroso seu código ajudou bastante

Criado 4 de outubro de 2006
Ultima resposta 11 de set. de 2014
Respostas 22
Participantes 15