Galera dei uma pesquisada aqui e em outros foruns e nao consegui achar a solução pro meu problema.
Tenho na minha aplicação um fileupload pra fazer upload de documentos em pdf, doc, xls e por ai vai, quando é feito o upload eu salvo o documento no banco e em uma pasta do servidor, funciona bunitinho.
Na hora de mostrar a tabela eu mostro os documentos através de um sql que busca os documentos no banco.
O problema é quando tento fazer download dos documentos. Ele ñ mostra nenhum erro, mas no brownser aparece vários caracteres estranhos e ñ faz o download. Ele nem abre a janelinha informando onde quer salvar o arquivo.
Alguém já passou por isso??
MINHA JSF
<rich:tab label="Documentação">
<a4j:region id="upDocs">
<h:form>
<h:outputText value="Arquivos: " styleClass="campo"/>
<rich:fileUpload id="imagem"
fileUploadListener="#{provaController.uploadDocumentos}"
acceptedTypes="doc, pdf, odt"
maxFilesQuantity="5"
styleClass="campo"
addControlLabel="Adicionar"
clearAllControlLabel="Limpar tudo"
clearControlLabel="limpar"
stopEntryControlLabel="Parar"
uploadControlLabel="Enviar"
sizeErrorLabel="Tamanho do Arquivo é maior que 300 Kbytes"
transferErrorLabel="Erro na Transferência do arquivo"
doneLabel="Arquivo enviado!">
<a4j:support event="onuploadcomplete" reRender="tabelaDoc" />
</rich:fileUpload>
<br/>
<br/>
</h:form>
</a4j:region>
<rich:panel bodyClass="rich-laguna-panel-no-header" >
<h:form>
<%-- ----------------------------------------------------- Início tabela de Imagens -------------------------------------------------- --%>
<a4j:outputPanel id="tabelaDoc">
<rich:dataTable
value="#{provaController.todosDocumentos}"
onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
var="doc" rows="10" rowKeyVar="row"
ajaxKeys="#{dataTableScrollerBean.keys}" id="tbListaDoc"
onRowContextMenu="if (row) row.style.backgroundColor='#{a4jSkin.tableBackgroundColor}';
this.style.backgroundColor='#F1F1F1'; row=this;
#{rich:component('menu')}.show(event,{docID:'#{provaController.doc.iddocumentos}', currentRow:'#{row}'});
return false;">
<f:facet name="header">
<h:outputText value="Documentos" styleClass="campo"></h:outputText>
</f:facet>
<rich:column>
<f:facet name="header">
<h:outputText value="Nome" styleClass="campo"/>
</f:facet>
<h:outputText value="#{doc.nome}" id="nomeDoc" styleClass="campo"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Ações" />
</f:facet>
<a4j:commandLink ajaxSingle="true" id="downloadPanelLink" action="#{provaController.download}"
disabled="#{provaController.disable}" immediate="true">
<h:graphicImage value="imagens/download.jpg" style="border:0" width="25px"/>
<f:setPropertyActionListener value="#{row}"
target="#{dataTableScrollerBean.currentRow}" />
</a4j:commandLink>
<rich:toolTip for="downloadPanelLink" value="Clique aqui para baixar o documento" />
<a4j:commandLink ajaxSingle="true" id="removeDocumentolink" action="#{provaController.prepararExcluirDocumento}"
oncomplete="#{rich:component('deleteDocumentoPanel')}.show();" disabled="#{provaController.disable}">
<h:graphicImage value="imagens/delete.gif" style="border:0" width="17px"/>
<f:setPropertyActionListener value="#{row}"
target="#{dataTableScrollerBean.currentRow}" />
</a4j:commandLink>
<rich:toolTip for="removeDocumentolink" value="Remover o Documento" />
</rich:column>
<f:facet name="footer">
<rich:datascroller id="datascroller" />
</f:facet>
</rich:dataTable>
</a4j:outputPanel>
<%-- ----------------------------------------------------- Fim tabela de Documentos ----------------------------------------------------- --%>
<br/>
<br/>
<h:outputText value="Atenção: " styleClass="campo"/><br/>
<h:outputText value="- Tamanho Máximo dos Arquivos: 300 Kbytes " styleClass="campo"/><br/>
<h:outputText value="- Só é permitido arquivos .doc, .pdf, .odt" styleClass="campo"/><br/>
<h:outputText value="- Não utilize acentos, cedilha ou espaço nos nomes dos arquivos (a foto não aparecerá na Intranet)."
styleClass="campo"/><br/>
public String download() {
System.out.println("download()");
doc = (Documentos) model.getRowData();
setBaixandoDoc(true);
//O primeiro parametro é o nome do arquivo que aparece para o usuario no download pode ser qualquer um.
downloadFile(doc.getNome(), doc.getPath() + "/" + doc.getNome());
// downloadFile(doc.getNome(), doc.getPath(), "pdf", FacesContext.getCurrentInstance());
return "";
}
public String downloadFile(String nomeDoArquivoGeradoParaDownload, String caminhoRelativoComNomeEextensao) {
System.out.println("downloadFile()");
System.out.println("nomeDoArquivoGeradoParaDownload " + nomeDoArquivoGeradoParaDownload);
System.out.println("caminhoRelativoComNomeEextensao " + caminhoRelativoComNomeEextensao);
if (isAtualizando()) {
if (isBaixandoDoc()) {
System.out.println("baixando...");
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
ServletContext servletContext = (ServletContext) context.getContext();
System.out.println("servletContext " + servletContext.getRealPath(caminhoRelativoComNomeEextensao));
//Obtem o caminho para o arquivo e efetua a leitura
//byte[] arquivo = readFile(new File(doc.getPath() + "/" + doc.getNome()));
byte[] arquivo = readFile(new File(caminhoRelativoComNomeEextensao));
System.out.println("arquivo " + arquivo);
HttpServletResponse response = (HttpServletResponse) context.getResponse();
//configura o arquivo que vai voltar para o usuario.
response.setHeader("Content-Disposition", "attachment;filename=\"" + nomeDoArquivoGeradoParaDownload + "\"");
response.setContentLength(arquivo.length);
response.setContentType("application/octet-stream");
//isso faz abrir a janelinha de download
response.setContentType("application/download");
//envia o arquivo de volta
try {
OutputStream out = response.getOutputStream();
out.write(arquivo);
out.flush();
out.close();
FacesContext.getCurrentInstance().responseComplete();
} catch (IOException e) {
System.out.print("Erro no envio do arquivo");
e.printStackTrace();
}
}
}
return "";
}
//efetua a leitura do arquivo
public static byte[] readFile(File file) {
int len = (int) file.length();
byte[] sendBuf = new byte[len];
FileInputStream inFile = null;
try {
inFile = new FileInputStream(file);
inFile.read(sendBuf, 0, len);
} catch (FileNotFoundException e) {
System.out.print("Arquivo não encontrado");
e.printStackTrace();
} catch (IOException e) {
System.out.print("Erro na leitura do arquivo");
e.printStackTrace();
}
return sendBuf;
}