Transformar request em Download de arquivo

5 respostas
J

Bom dia pessoal:
Estou utilizando JSF 2, e estou precisando baixar um arquivo pdf durante um request jsf.

Eu criei um botão com o primefaces: 3.0.1
Visão:

<p:remoteCommand name="exportar" action="#{jasperReports.Exportar}" process="@this"/>

bean:

public void Exportar() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        byte[] arquivoPdf = GerarPdf();
        response.reset();
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=Relatorio.pdf");
        response.setHeader("Cache-Control", "no-cache");
        response.getOutputStream().write(arquivoPdf); 
        response.getCharacterEncoding(); 
        context.responseComplete(); 
    }

O problema é que não acontece nada… alguém sabe o que estou fazendo de errado?
O debug passa pelo meu méthodo, não acontece erro algum no trace.
O arquivo pdf esta ok.

Pelo firebug eu vi que o retorno do meu request fica vazio.
Valeu

5 Respostas

P

jcoelho.cs:
Bom dia pessoal:
Estou utilizando JSF 2, e estou precisando baixar um arquivo pdf durante um request jsf.

Eu criei um botão com o primefaces: 3.0.1
Visão:

<p:remoteCommand name="exportar" action="#{jasperReports.Exportar}" process="@this"/>

bean:

public void Exportar() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        byte[] arquivoPdf = GerarPdf();
        response.reset();
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=Relatorio.pdf");
        response.setHeader("Cache-Control", "no-cache");
        response.getOutputStream().write(arquivoPdf); 
        response.getCharacterEncoding(); 
        context.responseComplete(); 
    }

O problema é que não acontece nada… alguém sabe o que estou fazendo de errado?
O debug passa pelo meu méthodo, não acontece erro algum no trace.
O arquivo pdf esta ok.

Pelo firebug eu vi que o retorno do meu request fica vazio.
Valeu

Olá amigo, tente dar um flush no stream de saida, veja:
response.getOutputStream().flush();

Espero ter ajudado. Abraço.

J

Valeu Paulo…
Realmente precisa do flush… mas mesmo assim não resolveu o problema… continua vindo vazio.

J

Pessoal… alterei a minha classe pra ler um pdf.
Mas mesmo assim… não consigo alterar os cabeçalhos pra efetuar o download do arquivo:
veja só como ficou meu método:

public String Exportar() throws IOException {
        final InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("relatorio.pdf");
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        byte[] arquivoPdf = IOUtils.toByteArray(resourceAsStream);
        response.reset();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "inline; filename=Relatorio.pdf");
        response.setHeader("Cache-Control", "no-cache");
        response.getOutputStream().write(arquivoPdf);
        response.getOutputStream().flush();
        response.getOutputStream().close();
        context.responseComplete();
        return null;
    }

Agora acontece um erro no firebug
Erro no processamento de XML: nenhum elemento encontrado Posição: moz-nullprincipal:{cd6985ee-e16a-4732-b8b4-5d75cef5dc96} Número da linha 1, coluna 1:

Tb ja troquei o pdf por um arquivo válido, pra ter certeza que o pdf esta correto, e o erro ficou igual…

P

jcoelho.cs:
Pessoal… alterei a minha classe pra ler um pdf.
Mas mesmo assim… não consigo alterar os cabeçalhos pra efetuar o download do arquivo:
veja só como ficou meu método:

public String Exportar() throws IOException {
        final InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("relatorio.pdf");
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        byte[] arquivoPdf = IOUtils.toByteArray(resourceAsStream);
        response.reset();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "inline; filename=Relatorio.pdf");
        response.setHeader("Cache-Control", "no-cache");
        response.getOutputStream().write(arquivoPdf);
        response.getOutputStream().flush();
        response.getOutputStream().close();
        context.responseComplete();
        return null;
    }

Agora acontece um erro no firebug
Erro no processamento de XML: nenhum elemento encontrado Posição: moz-nullprincipal:{cd6985ee-e16a-4732-b8b4-5d75cef5dc96} Número da linha 1, coluna 1:

Tb ja troquei o pdf por um arquivo válido, pra ter certeza que o pdf esta correto, e o erro ficou igual…

Olá amigo, esperimente não fechar o stream do response remova o response.getOutputStream().close();
em seguida vc precisa debugar para ver se o inputStream está populado com dados ok! Pode estar retornando null.

fallow

J

Bom dia Paulo…
Fiz a alteração que vc sugeriu, acontece o mesmo…
Mas debugando notei que o response esta nulo… e eu não consegui trocar nem o cabeçalho.
Isso não funciona

response.setContentType("application/pdf");

mas eu consegui adicionar o header, isso funcionou:
Até no firebug apareceu:
Isso funcionou

response.setHeader("Content-Disposition", "inline; filename=Relatorio.pdf"

Pq será que não consigo alterar o response?
muito estranho…

Criado 12 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 5
Participantes 2