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.
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”)
Eu estava com o mesmo problema esses dias, ai usei o seguinte código para fazer o download:
publicstaticvoiddownload(byte[]arquivo,Stringfilename){HttpServletResponseresponse;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(Exceptione){Messages.adicionaMensagemDeErro("Erro ao disponibilizar o arquivo para download !");}}
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
StringpaginaWeb="";BufferedReaderbr=null;StringBuilderret=newStringBuilder("");ExternalContextcontext=facesContext.getExternalContext();HttpServletResponseresponse=(HttpServletResponse)context.getResponse();paginaWeb=arrumaCaminhoCssRich(url,caminhoCss,facesContext);Filefile=newFile(nomeArquivo+".pdf");OutputStreamos=newFileOutputStream(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());FileInputStreamin=newFileInputStream(file);OutputStreamout=response.getOutputStream();byte[]buf=newbyte[(int)file.length()];intcount;while((count=in.read(buf))>=0){out.write(buf,0,count);}in.close();out.flush();out.close();facesContext.responseComplete();}catch(Exceptione){e.printStackTrace();thrownewException("Erro na criação do pdf - "+e.getMessage());}
S
sciuba
alguém?
S
sciuba
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