No sistema que tou fazendo, pego um List e com JSTL apresento ao usuário. No final da página, tem um botão, GERAR ARQUIVO. Ao clicar vou pro ACTION, lá recupero a list com o getAttribute();
A questão é: Gostaria de gerar um arquivo .txt e que automaticamente abrisse uma caixa de download pro usuário. Como posso fazer isso?
você deve gerar o arquivo no servidor. Tenha certeza que o application server (usuário) tenha acesso de read/write no diretório que você vai criar o arquivo.
Depois você pode disponibilizar um link para o usuário clicar e fazer o download, ou então enviar um RequestDispatcher do arquivo (procure no forum que isso ja foi comentado aqui).
/**
* Este código vai na action.
*
*/
// Pasta Arquivos fica no projeto WEB, dentro do WebContent
InputStream is = getClass().getClassLoader().getResourceAsStream("/Arquivos/MeuArquivo.txt");
byte[] b = inputStreamToBytes(is);
ServletOutputStream out = response.getOutputStream();
response.reset();
response.setHeader("Content-Disposition", "attachment;filename=MeuArquivo.txt");
response.setContentType("Application/xls");
response.setContentLength(b.length);
out.write(b);
out.flush();
out.close();
/**
* Este código vai no jsp.
*
*/
<p>Clique no link para fazer o download da planilha template.</p>
<br/>
<a href = 'DownloadArquivoAction'>
<img src="//caminhodasuaimagem.gif" alt="" width="10" height="10" /> <b>Download do arquivo</b></a>
<br />
[quote=jrjorro]Aleck, você pode me explicar o que esses passos fazem ?
Obrigado, vlw pela dica[/quote]
//Coloca na memoria o arquivo texto, o arquivo é lido do diretório WebContent\Arquivos
InputStream is = getClass().getClassLoader().getResourceAsStream("/Arquivos/MeuArquivo.txt");
// Transforma o arquivo em um array de bytes
byte[] b = inputStreamToBytes(is);
// Pega o outputstream ( o caminho de comunicação entre o servidor e o navegador)
ServletOutputStream out = response.getOutputStream();
// Limpa os dados do response.
response.reset();
// define o nome do arquivo que o usuário irá baixar
response.setHeader("Content-Disposition", "attachment;filename=MeuArquivo.txt");
// define o tipo de arquivo
response.setContentType("text/txt");
// define o tamanho do arquivo
response.setContentLength(b.length);
// envia o arquivo para o usuario
out.write(b);
out.flush();
out.close(); // fecha o caminho
dá o seguinte erro nessa linha:byte[] b = InputStreamToBytes(is);
dá cannot find symbol. Achei que era falta de um try - catch pra IOException, mas n! erro do mesmo jeito.try{
java.io.InputStream is = getClass().getClassLoader().getResourceAsStream("/home/moises/gerado.txt");
byte orig[] = InputStreamToBytes(is);
}catch(IOException io){
throw io;
}
na action
String arquivoTexto = "sua String";
quando terminar de criar sua String vc pode colocar arquivoTexto.concat(".txt") por exemplo
this.sendStringWithName(arquivoTexto , "nmArquivo", response);
metodo qse encarrega do resto
/**
* Envia uma String no formato de array de bytes para o response, a fim de ser
* feito o download.
* @param send = arquivo que sera aberto
* @param name = nome dado ao arquivo
* @param response = HttpServletResponse
*/
public void sendStringWithName(String send, String name, HttpServletResponse response) throws IOException {
byte[] report = send.getBytes();
response.setContentType("application/save");
response.setContentLength(report.length);
response.setHeader("Content-Disposition", "attachment; filename=\"" + name+"\"");
response.addHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(report, 0, report.length);
outputStream.flush();
outputStream.close();
}
Com isso o arquivo eh gerado na memoria, nao precisando salvar e carregar um arquivo
espero tem ajudado