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());
}
}
sciuba
Agosto 28, 2012, 7:36am
#6
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());
}
sciuba
Agosto 28, 2012, 8:40am
#8
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>