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()
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 = (HttpServletRequest) ctx
.getExternalContext().getRequest();
//Observe que o arquivo index.html está na raiz da aplicação. Pego o diretório a partir dele
//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 = (HttpServletResponse) ectx.getResponse();
resp.setHeader("Content-Disposition", "attachment;filename=" + file + "");
resp.setContentLength((int) f.length());
resp.setContentType(mimeType);
try {
FileInputStream in = new FileInputStream(f);
OutputStream out = resp.getOutputStream();
byte[] buf = new byte[(int) f.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
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...
criei até um tópico no GUJ:
http://www.guj.com.br/java/294021-download-de-planilha-excel