Olá pessoal,
Fiz algumas pesquisas, mas não consegui resolver o problema, então peço a ajuda dos colegas:
Contextualizando: Tenho uma lista de arquivos em uma datatable(estou usando richfaces), para cada linha da tabela tem um botão para fazer o download do arquivo correspondente.
O problema é que quando jogo o conteudo para a página, está “imprimindo” o conteúdo do arquivo direto na página ao invés de abriar a caixa de diálogo para abrir ou salvar.
Os arquivos podem ser de diversos tipos: pdf, xls, eap, doc, txt, zip, mpp, jpg, entre outros.
Segue as partes do código para análise:
JSF:
<rich:column id="BDownload"
style=" width : 100px;" >
<f:facet name="header">
<h:outputText id="OTDownload"
value="Download"
style=" width : 100px;" />
</f:facet>
<a4j:commandButton
value="Download"
action="#{listaArtefatos.download}"
ajaxSingle="true"
style=" width : 70; ">
<a4j:actionparam name="current"
value="#{row}"
assignTo="#{listaArtefatos.indexAtual}"
/>
</a4j:commandButton>
</rich:column>
Mbean
public void download() {
this.entrada = revisoes.get(indexAtual);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos = svn.recuperarArquivo(entrada.getUrl(), entrada.getNome(),
entrada.getRevisao());
executeDownload(baos, entrada.getNome());
}
private void executeDownload(ByteArrayOutputStream baos, String fileName) {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) facesContext
.getExternalContext().getResponse();
response.setHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\";");
response.setContentType("application/force-download");
response.setContentLength( baos.size() );
ServletOutputStream sos;
try {
sos = response.getOutputStream();
baos.writeTo(sos);
sos.flush();
} catch (IOException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}