[javast] Download com formato PDF

7 views
Skip to first unread message

Junior de Paula Sousa

unread,
Oct 6, 2008, 12:21:23 PM10/6/08
to jav...@googlegroups.com
Oi pessoal,

Eu estou implementando uma funcionalidade de download de arquivos pdf's, que conforme o requisito que recebi eu não posso deixar o arquivo abrir na página. O que deve acontecer é que toda as vezes que o usuário for fazer o download de algum arquivo, deverá abrir uma caixa de dialogo para ele salvar o arquivo em algum diretório.

Eu tentei usar o seguinte código:

public void download() throws Exception {
       
        File file = new File("C:\\Users\\ejunsou\\Desktop\\Download de arquivos\\test.pdf");
       
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition","attachment; filename=test.pdf");
   
        FileReader fr = new FileReader(file);
        while (fr.ready()) {
            response.getOutputStream().write(fr.read());
        }
       
    }

A caixa de diálogo para salvar o arquivo aparece normalmente, mas o conteúdo do arquivo desaparece. Na execução do método ocorre a seguinte exception:

java.lang.IllegalStateException: Cannot forward after response has been committed
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:312)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415)
    at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

Alguém pode me ajudar ?


Rogerio Pereira

unread,
Oct 6, 2008, 1:04:21 PM10/6/08
to jav...@googlegroups.com
coloque FacesContext.getCurrentInstance().responseComplete() no final do método, tenho algo assim aqui e funcionou.

    public void gerar()
    {
        File reportFile = new File(((ServletContext) contextoAplicacao.getExternalContext()
            .getContext()).getRealPath("/relatorios/" + arquivoModelo));
           
        byte[] bytes = null;
       
        Map parametros = new HashMap();
        parametros.put("TITULO", titulo);
       
        JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(dados);
       
        try
        {
            bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),
                    parametros, fonteDados);

           
            HttpServletResponse response = (HttpServletResponse)   
            FacesContext.getCurrentInstance().getExternalContext().getResponse();   
            response.setContentType( "application/pdf" );                   
           
            OutputStream saida = response.getOutputStream();
            saida.write(bytes, 0, bytes.length);
            saida.flush();
            saida.close();
           
            FacesContext.getCurrentInstance().responseComplete();       
        }
        catch (Exception e)
        {
            System.out.println("Falha na geração do relatório!");
            e.printStackTrace();
        }       
    }


2008/10/6 Junior de Paula Sousa <juni...@ig.com.br>



--
Regards,

Rogério (_rogerio_)

[Blog: http://faces.eti.br]  [Sandbox: http://bmobile.dyndns.org]  [Twitter: http://twitter.com/ararog]

"Faça a diferença! Ajude o seu país a crescer, não retenha conhecimento, distribua e aprenda mais."
(http://faces.eti.br/2006/10/30/conhecimento-e-amadurecimento)

Vinicius Souza

unread,
Oct 6, 2008, 1:39:01 PM10/6/08
to jav...@googlegroups.com
eu postei um há um tempo atras um codigo para fazer download...só procurar

2008/10/6 Rogerio Pereira <rogerio...@gmail.com>

Junior de Paula Sousa

unread,
Oct 6, 2008, 2:09:23 PM10/6/08
to jav...@googlegroups.com
Valeu pessoal, consegui fazer com o exemplo do Vinicius.

Em 06/10/08, Vinicius Souza <vin...@gmail.com> escreveu:

Bruno Lellis

unread,
Oct 6, 2008, 12:58:35 PM10/6/08
to jav...@googlegroups.com
Junior,
Este link deve te ajudar: http://wiki.apache.org/myfaces/Sending_Files

[]s
Bruno

André Moreira

unread,
Oct 6, 2008, 7:52:02 PM10/6/08
to jav...@googlegroups.com
Olá Jr.

Só uma dica.

Na empresa que presto helpdesk, eles tem um portal em Struts, que existe uma funcionalidade que nem a que você disse.
Funciona numa boa, porém teve um belo dia, que parou de funcionar... Daí resumindo a história.
A configuração do Adobe Reader estava obrigando que o arquivo fosse aberto diretamente no navegador.

Então não sei se somente essa configuração no lado do servidor resolve, o download do PDF.

Flw!

2008/10/6 Bruno Lellis <bruno...@gmail.com>



--
Grato.
André Moreira
Portifólio: http://mourdok.awardspace.com/portfolio
Blog: http://mourdok.awardspace.com/blog

"Software não é ouro, é alface: um bem perecível. Se não for aprimorado ao longo do tempo, acaba estragando.", Brian Behlendorf.
Reply all
Reply to author
Forward
0 new messages