Criando um arquivo para download

Tutorial de como criar um arquivo de texto e fazer o download no navegador com JSF.

Vou criar um arquivo do tipo csv. Após ser criado o arquivo será feito o download do mesmo.

Aqui preparo o arquivo o caminho (path), informo o tipo de arquivo (mais opções de tipo de arquivo aqui), crio o arquivo e mando pra download.
Observe que o nome do arquivo é arquivo_ + a data de hoje.
O tipo de arquivo é texto (text/plain).

O método exportaCSV()
public void exportaCSV() throws DaoException {
  FacesContext ctx = FacesContext.getCurrentInstance();
  String file = Utils.pathArquivo("arquivo_" new SimpleDateFormat("dd-MM-yyyy").format(new Date()) ".csv");
  String mimeType = "text/plain";
  createFile();
  Utils.downloadFile(mimeType, ctx, file);
}

O método pathArquivo da classe Utils. Pega o path real da aplicação
public static String pathArquivo(String fileName) {
  FacesContext ctx = FacesContext.getCurrentInstance();
  HttpServletRequest request = (HttpServletRequestctx
      .getExternalContext().getRequest();
  //Observe que o arquivo index.html está na raiz da aplicação. Pego o diretório a partir dele
  String caminho = request.getRealPath("/index.html");
  int index = caminho.lastIndexOf("/");
  caminho = caminho.substring(0, ++index);
  return caminho + fileName;
} 

Criando o arquivo...
private void createFile() throws DaoException {
    List<Terminal> lista = new TerminalService().getListaDeTodosTerminais(); //preencho a lista com uma consulta do banco de dados
  
    //verifico se o arquivo existe. Se sim apago e crio um novo.
    try {
      boolean exists = (new File(file)).exists();
      if (exists) {
        (new File(file)).delete();
      
      File f = new File(file);
      boolean success = f.createNewFile();
      if (success) {
        copyToFile(lista);
      else {
          throw new DaoException("Erro ao tentar criar o arquivo!");
      }
      
    catch (IOException e) {
    }
}


Preenchendo o arquivo  
private void copyToFile(List lista) {
  try {
      BufferedWriter out = new BufferedWriter(new FileWriter(file, true));
      
    //colunas (1.ª linha)
    out.write("\"prefixo\";\"ddd\";\"numero\"\n");
      
    for (int i=0; i<lista.size(); i++) {
      Object[] o = (Object[]) lista.get(i);
      
      //linhas 
      out.write("\""+ o[0+"\";\""+o[1]+"\";\""+o[2]+"\"\n");
    }
      out.close();
  catch (IOException e) {
  }
}

O método downloadFile, que é quem vai fazer o download do arquivo
public static void downloadFile(String mimeType, FacesContext ctx, String file) {
  ExternalContext ectx = ctx.getExternalContext();
  File f = new File(file);
  HttpServletResponse resp = (HttpServletResponseectx.getResponse();
  resp.setHeader("Content-Disposition""attachment;filename=" + file + "")
  resp.setContentLength((intf.length());
  resp.setContentType(mimeType);
  try {
    FileInputStream in = new FileInputStream(f);
    OutputStream out = resp.getOutputStream();
    byte[] buf = new byte[(intf.length()];
    int count;
    while ((count = in.read(buf)) >= 0) {
      out.write(buf, 0, count);
    }
    in.close();
    out.flush();
    out.close();
    ctx.responseComplete();
  catch (IOException ioe) {
    System.err.println(ioe.getMessage());
  }
}

Simples assim!

Comentários

MrDiniz disse…
Olá amigo blz??

cara, eu queria só um método para download... eu crio um arquivo excel e tal, grava em um diretório dentro do eclipse e ta la o arquivo certinho... BUT... não sei como fazer o usuário fazer o download do mesmo...
MrDiniz disse…
Cara... tenho um sistema que monta um arquivo excel com resultados do banco e gravo o arquivo em um diretório dentro do eclipse, está certinho... só que queria fazer uma função de download mas não sei como...
criei até um tópico no GUJ:

http://www.guj.com.br/java/294021-download-de-planilha-excel

Postagens mais visitadas deste blog

Utilizando um pool de conexões com hibernate

Gravando dados de um arquivo CSV no Oracle utlizando Python e a biblioteca cx_Oracle

Popup em JSF sem Javascript