Problema em download de arquivo via JSF

Bom dia galera!

 Estou com um problema a um tempo e nao sei o que pode ser. Tenho um bean que efetua o download de um arquivo, porém em vez de abrir a caixa de "Salvar arquivo" ele escreve na tela com os caracteres especiais, parece que ele tenta abrir o arquivo direto no navegador.

 Segue código do meu bean:
     public void downloadAnexo() throws IOException {
               HttpServletResponse response = (HttpServletResponse) FacesContext
				.getCurrentInstance().getExternalContext().getResponse();

		response.setHeader("Content-Disposition", "attachment;filename=\""
				+ "Teste.xls" + "\"");
		response.setContentLength(this.procedimento.getArquivo().length);

		try {
			response.setContentType("application/vnd.ms-excel");
			response.getOutputStream().write(this.procedimento.getArquivo());
			response.getOutputStream().flush();

			FacesContext.getCurrentInstance().responseComplete();
		} catch (Exception e) {
			System.out.print(e.getMessage());
		}
       }
      A chamada para o método esta da seguinte forma:

      [code]
      <a4j:commandLink value="#{procedimentoBean.procedimento.nomeArquivo}" 
           action="#{procedimentoBean.downloadAnexo}"/>
      [/code]

      Alguem faz alguma ideia do que pode estar acontecendo?  :roll: 

Valew!

Acho que o a4j:commandLink por padrão tenta fazer uma requisição ajax e o download não pode ser via ajax (pelo menos menos o commandLink do primefaces é, ai tem que colocar o atributo ajax=“false”)

No lugar do a4j tenta o do JSF mesmo:

<h:commandLink value="#{procedimentoBean.procedimento.nomeArquivo}"   
     action="#{procedimentoBean.downloadAnexo}"/>

Infelizmente o problema continua…

Ja tentei de tudo e nao vai…

Alguem sabe o que pode estar acontecendo?

Muda o setContentType para:

response.setContentType("application/download");

Eu estava com o mesmo problema esses dias, ai usei o seguinte código para fazer o download:

 public static void download(byte[] arquivo, String filename) { 
		 	HttpServletResponse response;
	        try {
	        	response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
	        	response.setContentType("application/download");
			response.addHeader("Content-Disposition", "attachment; filename=" + filename);
		        response.setContentLength(arquivo.length);
	                response.getOutputStream().write(arquivo);
	                response.getOutputStream().flush();
	                response.getOutputStream().close();

	            FacesContext.getCurrentInstance().responseComplete();
	        }catch (Exception e) {
	        	Messages.adicionaMensagemDeErro("Erro ao disponibilizar o arquivo para download !");
			}
	    }

E no botão eu usei um <h:commandButton>

altera para:

public void downloadAnexo() throws IOException 
{  
			/*
			HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();  
			response.setHeader("Content-Disposition", "attachment;filename=\"" + "Teste.xls" + "\"");  
			response.setContentLength(this.procedimento.getArquivo().length); 
			*/
			
			FacesContext context = FacesContext.getCurrentInstance();	 		
			HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();	
			
			try 
			{  
                                /*
                                 response.setContentType("application/vnd.ms-excel");  
				response.getOutputStream().write(this.procedimento.getArquivo());  
				response.getOutputStream().flush();  
			  
				FacesContext.getCurrentInstance().responseComplete();  
                                 */


				response.setContentType("application/octet-stream"); 
				response.setHeader("Content-disposition","attachment; filename=" + this.procedimento.getArquivo().getName());
				response.setContentLength(this.procedimento.getArquivo().length);
				
				ServletOutputStream outputStream = response.getOutputStream();
				outputStream.flush();
				outputStream.write(this.procedimento.getArquivo(),0,this.procedimento.getArquivo().length);
				outputStream.flush();
				outputStream.close();
				
			  
				context.responseComplete();  
			} 
			catch (Exception e) 
			{  
				System.out.print(e.getMessage());  
			}  
} 	

Estou com o mesmo problema do amigo!!!

O problema é que além de chamar um action preciso que dispare uma função java script e utilizando o h:commandLink ele simplesmente ignora o atributo onclick
e com o a4j funciona perfeito porém acontece oque o amigo no primeiro post falou joga o binário na tela

estou declarando assim:

<h:commandLink onclick="javascript:contentFromIframe('frameOcorrenciaImp');" action="#{Academico$adCentralOcorrencias.converteRelatorioParaPdf}" styleClass="positive right">
      <h:outputText id="hotSave" value="#{msg['apontamentoOcorrencia.SalvarRelatorio']}"/>
</h:commandLink>

codigo para donwload:

String paginaWeb = "";
            BufferedReader br = null;  
            StringBuilder ret = new StringBuilder(""); 
            ExternalContext context = facesContext.getExternalContext();
            HttpServletResponse response = (HttpServletResponse) context.getResponse();
            
            paginaWeb = arrumaCaminhoCssRich(url, caminhoCss, facesContext);
            
            File file =  new File(nomeArquivo+".pdf");

            OutputStream os = new FileOutputStream(file);
            convert(os, paginaWeb);
            
            os.flush();
            os.close();
            
            response.setContentType("application/download");
            response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName());
            response.setContentLength((int) file.length());
            
            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 (Exception e) {
            e.printStackTrace();
            throw new Exception("Erro na criação do pdf - "+ e.getMessage());
        }

alguém?

Resolvi o meu problema, porém não sei porque com o h:commandlink não deu certo usei um h:commandButton mesmo e consegui efetuar as chamadas: action e onclick. Mas precisei do 4aj:support para atualizar o formulario antes de chegar no Mbean

Segue código do botão:

<h:commandButton value="#{msg['apontamentoOcorrencia.SalvarRelatorio']}" onclick="javascript:contentFromIframe('frameOcorrenciaImp');" action="#{Academico$adCentralOcorrencias.converteRelatorioParaPdf}" styleClass="positive right">
     <a4j:support event="onclick" immediate="true" reRender="formCentralOcorrencias"/>
</h:commandButton>