Download não funciona

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;
    }

carra fiz essa semana um sistema de arquivos aki vo posta meu codigo pra voce pegar como exemplo

XHTML


<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Arquivos</title>
</h:head>
<h:body>
	<h:form enctype="multipart/form-data" update=":form:display">
		
		<div align="center">
			<p:panel header="Arquivos" style="width:1050px">
				<ui:include src="/paginas/Menu.xhtml" />
				<p:messages id="mensagens" showSummary="true" />
				
				<p:fileUpload
					fileUploadListener="#{arquivosBean.fileUploadAction}"
					update="mensagens" multiple="true"  />					
				<br />
				
				<p:dataTable var="arquivos" value="#{arquivosBean.listArquivos}"
				widgetVar="arquivosTable"
				emptyMessage="Nenhum arquivos Encontrado Nessas Condições" rowStyleClass="#{empty rowIx or rowIx
 mod 2 ne 0 ? 'even-row' : 'odd-row'}"
 rowIndexVar="rowIx" id="display" >

				<f:facet name="header">
					<p:outputPanel>
						<h:outputText value="Procurar em todos os campos:" />
						<p:inputText id="globalFilter" onkeyup="arquivosTable.filter()"
							style="width:150px" />
					</p:outputPanel>
				</f:facet>

				<p:column filterBy="#{arquivos.id}" headerText="Id" footerText="Id"
					filterMatchMode="contains">
					<h:outputText value="#{arquivos.id}" />
				</p:column>

				<p:column filterBy="#{arquivos.nome}" headerText="Descrição"
					footerText="Descrição" filterMatchMode="contains">
					<h:outputText value="#{arquivos.nome}" />
				</p:column>
				
				<p:column filterBy="#{arquivos.tipo}" headerText="Tipo"
					footerText="Tipo" filterMatchMode="contains">
					<h:outputText value="#{arquivos.tipo}" />
				</p:column>
				
				<p:column filterBy="#{arquivos.tamanho}" headerText="Tamanho"
					footerText="Tamanho" filterMatchMode="contains">
					<h:outputText value="#{arquivos.tamanho}" />
				</p:column>

				

				<p:column style="width:100px">
					<h:panelGrid columns="2" styleClass="actions" cellpadding="2">

						<h:commandButton image="/imagens/icones/download.gif" title="Download">
						<f:setPropertyActionListener value="#{arquivos.id}"
								target="#{arquivosBean.arquivo.id}" />
                        <p:fileDownload value="#{arquivosBean.file}" />  
                    </h:commandButton>  
						
						<h:commandButton image="/imagens/icones/excluir.gif" title="Excluir" action="#{arquivosBean.remove}" >
							<f:setPropertyActionListener value="#{arquivos.id}"
								target="#{arquivosBean.arquivo.id}"/>
						</h:commandButton>
					</h:panelGrid>
				</p:column>
			</p:dataTable>
				
				
				<style>
.ui-datatable .ui-datatable-data .even-row td {
     background-color:#fcefa1;
     border-right: solid 0px #4e6769; 
 }

 .ui-datatable .ui-datatable-data .odd-row td { 
     background-color:#f7f7f7;
     border-right: solid 0px #4e6769; 
 }
</style>
			</p:panel>
		</div>
	</h:form>
</h:body>
</html>

bean

[code]package br.com.projeto.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import javax.faces.context.FacesContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.projeto.beans.Arquivos;
import br.com.projeto.dao.HibernateDao;

@SessionScoped
@ManagedBean
public class ArquivosBean implements Serializable{

private Arquivos arquivo = new Arquivos();
private List<Arquivos> arquivos = new ArrayList<Arquivos>();
private StreamedContent file;

public String fileUploadAction(FileUploadEvent event) throws IOException {
	try {
		arquivo.setNome(event.getFile().getFileName());
		byte[] conteudo = event.getFile().getContents();
		String caminho = "C:\\arquivos\\" + event.getFile().getFileName();
		FileOutputStream fos = new FileOutputStream(caminho);
		fos.write(conteudo);
		fos.close();

		HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(Arquivos.class);
		arquivo.setCaminho(caminho);
		arquivo.setTamanho(conteudo.length);

		String nomeArquivo = arquivo.getNome();
		int e = nomeArquivo.lastIndexOf(".");
		arquivo.setTipo(nomeArquivo.substring(e));

		hibernateDao.salvar(arquivo);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Arquivo Salvo!", arquivo.getNome()));
	} catch (Exception e) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(
				FacesMessage.SEVERITY_ERROR, "Erro!", " " + e));
	} finally {			
		arquivo = new Arquivos();
		arquivos = new ArrayList<Arquivos>();	
		file = null;
	}	
	return "Arquivos.xhtml";
}

public List<Arquivos> getListArquivos() {
	HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(
			Arquivos.class);
	arquivos = hibernateDao.getBeans();
	return arquivos;
}

public void remove() {
	try {
		HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(Arquivos.class);
		Integer id = arquivo.getId();
		arquivo = hibernateDao.getBean(id);
		
		new File(arquivo.getCaminho()).delete();
		hibernateDao.deletar(arquivo);

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Arquivo Deletado!", arquivo.getNome()));
	} catch (Exception e) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(
				FacesMessage.SEVERITY_ERROR, "Erro!", " " + e));
	} finally {
		arquivo = new Arquivos();
		arquivos = new ArrayList<Arquivos>();
		file = null;
	}
}

public StreamedContent getFile() throws FileNotFoundException {

	HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(Arquivos.class);
	Integer id = arquivo.getId();
	arquivo = hibernateDao.getBean(id);
	String caminho = arquivo.getCaminho();
	FileInputStream stream = new FileInputStream(caminho);
	System.out.println("akiii"+caminho);
	
	return file = new DefaultStreamedContent(stream, caminho);
	
}

public void setFile(StreamedContent file) {
	this.file = file;
}

public Arquivos getArquivo() {
	return arquivo;
}

public void setArquivo(Arquivos arquivo) {
	this.arquivo = arquivo;
}

public List<Arquivos> getArquivos() {
	return arquivos;
}

public void setArquivos(List<Arquivos> arquivos) {
	this.arquivos = arquivos;
}

}
[/code]

web.xml


<filter>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>  
        <init-param>  
            <param-name>thresholdSize</param-name>  
            <param-value>51200</param-value>  
        </init-param>  
        <init-param>  
            <param-name>uploadDirectory</param-name>  
            <param-value>C:\arquivos</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
    </filter-mapping>