JSf - como fazer download de um arquivo pelo h:commandButton?

Bom dia :smiley:

Tenho um h:commandButton que tem uma ação de gerar um relatório no formato no formato .csv e eu preciso que o relatório seja gerado e automaticamente abra uma opção de download de arquivo.

No fundo seria apenas um download de arquivo e minha dúvida é como disponibiliar esse aquivo, tem alguma maneira de eu enviar esse arquivo para a página e abrir a opção de download?

[]'s

olá …

vc pode chamar um servlet que faça isso !!! …

mas para ser um servlet é mais facil vc utilziar um outputLink …

eu li (acho q foi aqui no Guj … um post do Urubatan) q fazer essas coisas com servlet é gambi e coisa e tal … q o certo era usar EL …
mas como nao entendi resolvi usar servlet mesmo q funcionou …

qq duvida “tamo ae”

entendi…

eu pensei em utilizar um servlet tb, mas isso me soou como porqueira hahaha…eu achei esse post do urubatan ( http://www.guj.com.br/posts/list/32389.java ), e acho que ele me referia a EL do JSF e não a EL de JSP…aquela ($…)

mas a EL do JSF eu já utilizo ela…aqueles #bean.xxx seria o EL do JSF? se for usar assim, posso chamar um metodo ao invés de um servlet, concorda?

[]s

eu tbm achei q ia ficar porco … fica medio … ehhehe

da sim … eu vi um exemplo de iReport com JSF mas nao funcionou …

entao eu gerei os relatorios no backbea e dei um redirect para o servlet.

Eu uso esses dois métodos, tem que dar uma adaptada, mas n precisa de servlet…

[code]public static synchronized void downloadFile(String fullPath) {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
String fileName = getFileNameByPath(fullPath);
File file = new File(caminhoC + fullPath);
HttpServletResponse response = (HttpServletResponse) context.getResponse();
response.setHeader(“Content-Disposition”, “attachment;filename=”" + fileName + “”");
response.setContentLength((int) file.length());
response.setContentType(getFileMimeByPath(fullPath));

    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.getCurrentInstance().responseComplete();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public static synchronized void downloadFile() {
    String fullPath = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("linkDownload");
    downloadFile(fullPath);
}[/code]

Eu to usando um método bem parecid com o seu e to com umas dúvidas pq eu não gravo nada no disco do servidor:

		HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
		OutputStream outputStream = response.getOutputStream();
		response.setContentType("application/vnd.ms-excel");
		response.setHeader("Content-disposition", "attachment; filename=arquivo_divergencias.xls");

		arquivoXls.write(outputStream);
		
		outputStream.flush();
		outputStream.close();

Como que eu uso byte[] e qual a função dele ai no meio? O problema no meu código é que além dele enviar o arquivo, ele está gravando toda a minha tela jsp dentro do arquivo além das informações.

[]'s

arquivoXls é de que tipo ? File ?

Eu acho que o que acontece é que você não está colocando esse pedaçõ:

FacesContext.getCurrentInstance().responseComplete(); 

pra dar a resspota como completa…

tenta ae!

arquivoXls é um arquivo HSSFWorkbook do POI.

Então, eu já tentei com o responseComplete() e ele continua gravando a jsp junto do arquivo hehe