Gerar arquivo e fazer download

senhores, boa tartde!

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?

Agradeço desde já!

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).

Algo do tipo: :smiley:



/**
 * 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 />

duplicou :oops:

Aleck, você pode me explicar o que esses passos fazem ?

Obrigado, vlw pela dica

[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

Alexandre,

dá o seguinte erro nessa linha:byte[] b = InputStreamToBytes(is);
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; }

Aguardo ajuda!

Me parece que você está programando com o bloco de notas, neste caso vc tem que fazer os imports corretos do exemplo que te passei:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletOutputStream;

Eu estava tendo um erro que dizia:

getOutputStream() has already been called for this response

mas ao olhar o exemplo dos amigos aqui, consegui entender melhor e resolver…

Obrigado senhores!

dae, eu faço assim:

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

Como eu faria isso mas com o java?

Estou utilizando Java com Struts para tratar as informações, e JSP apenas para as paginas.

Obrigado.