No sistema que trabalho, desenvolvi uma rotina para pegar algumas informações do banco e exportar para um arquivo txt. O problema é que o arquivo fica no servidor, eu queria que o usuário pode-se escolher onde o arquivo deve ser instalado, abrindo assim uma caixa onde ele pode abrir ou salvar o arquivo, essa caixa é muito comum no windows, porém não consigo fazer isso, ele sempre exporta de vez para o server. Existe alguma maneira pausível de se fazer tal coisa?
Dúvida sobre acesso a arquivo txt!
7 Respostas
Você está utilizando qual estrutura?
RMI…Servlets/JSP…etc
Dê mais informações sobre a arquitetura do seu sistema para podermos te ajudar… ok???
Você está utilizando qual estrutura?
RMI…Servlets/JSP…etcDê mais informações sobre a arquitetura do seu sistema para podermos te ajudar… ok???
O problema é esse, por ser em um ambiente WEB, ou seja servlet e JSP. Se fosse em um ambiente desktop isso seria ridículo.
Eu consegui fazer as rotinas de exportação, ou seja, consigo obter do banco e jogar os dados em arquivo txt, o problema é abrir essa caixa do qual o usuário tenha a possibilidade de salvar localmente!
bom, eu nao me lembro mto de programacao web, era do tempo do php hehe, mas acho q se vc setasse algum cabeçalho http ou algo do tipo indicando transferencia do arquivo, aparecia a janela padrao do browser de download de arquivos, acho que é isso que voce quer…
Isso é meio enjoado - você pode até tentar setar o content-type para algo tipo “application/octet-stream” e o browser vai tentar visualizar, como se fosse um arquivo texto tradicional.
Para forçar a barra, você pode setar o content-type para “application/x-naoexiste-programa” ou alguma outra coisa que comece com X, e que sabidamente não exista um “handler” para ele, para que force o download como se fosse um arquivo binário e abra a tal caixa para que o usuário salve o arquivo.
Cuidado! se for https (SSL) em vez de http pode dar algum problema com controle de cache. (Resumindo, no caso https, você pode baixar o arquivo, mas você deve fazer duas coisas:
- Não pode dizer aquelas coisas do tipo “pragma:nocache” - senão você nem consegue salvar o arquivo;
- Para evitar problemas de cache, baixe o arquivo sempre com um nome diferente.
Estou tentando fazer dessa forma! Mas agora fica salvando o conteudo da html
pageContext.getResponse().setContentType("application/octet-stream");
((HttpServletResponse) pageContext.getResponse()).addHeader("content-disposition",
"attachment; filename=Exportar.txt");
new TXTWriter(pageContext.getResponse().getOutputStream(),col);
A classe TXTWriter é a classe de exportacao que eu criei, ela recebe dois parametros, um a string do caminho do arquivo e o outro a colecao de dados!
Agora dentro da classe TXTWriter estou usando um WriteFile para escrever o arquivo
out = new BufferedWriter(new FileWriter(sCaminho));
Mas acho que terei que alterar alguma coisa para receber o OutputServletStream
Galera, segue abaixo o meu método que faz a exportação para TXT, o problema é que ele gera o HTML da página que tem o contexto e não gerá do arquivo que eu criei.
private void lerTXT()
{
try
{
File arquivo = new File(filename);
BufferedReader br = new BufferedReader(new FileReader(arquivo));
String str = "";
response = (HttpServletResponse) pageContext.getResponse();
response.setContentType("application/download"); //application/text
response.addHeader("content-disposition","attachment; filename=exportar.txt"); //attachment
ServletOutputStream os = response.getOutputStream();
PrintWriter pw = new PrintWriter(os);
while((str = br.readLine()) != null)
{
System.out.println(str);
pw.write(str);
}
} catch (Exception ex)
{
ex.printStackTrace();
}
}
Se eu utilizar…
PrintWriter pw = response.getWriter():
Obtenho a seguinte exception
java.lang.IllegalStateException: OutputStream already retrieved