Duvidas com response.sendRedirect

4 respostas
farzac

Bom dia Amigos

Estou gerando um arquivo csv e depois preciso abrir este mesmo arquivo porem quando antes de abrir o arquivo preciso que seja mostrado uma caixa com as opções de Abrir, Salvar e Cancelar

No firefox isto ocorre porem no IE o arquivo csv é aberto automaticamente pelo browser.

Alguem sabe me dizer o que preciso fazer, sera algum parametro que preciso setar no response antes de chamar o response.sendRedirect

Segue o codigo abaixo:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
          
        ArquivoCVS arquivoCVS = new ArquivoCVS();  
          
        List<List<String>> linha = new ArrayList<List<String>>();  
        List<String> coluna = new ArrayList<String>();                
        for(int i=0; i<2; i++){  
            coluna.add("teste");  
        }  
        linha.add(coluna);  
          
        arquivoCVS.escreverArquivo("/home/farzac/Server/glassfish3/glassfish/domains/domain1/applications/ProjArquivoTexto/cons_config_exec.csv", linha);  
        response.sendRedirect("/ProjArquivoTexto/cons_config_exec.csv");  
          
    }

4 Respostas

gomesrod

Olá,

Nesse caso é necessário incluir o header “contentDisposition: attachment” na resposta HTTP. Ele é responsável por informar ao browser que o conteúdo deve ser tratado como “arquivo para download” e não como “corpo” da página solicitada.
Sem este cabeçalho tudo fica a critério do browser: Para o IE o arquivo é o corpo da página e mostra na própria janela, já o Firefox interpreta que é um download.

Ah, e só lembrando: não é possível setar cabeçalhos HTTP em um redirect. Precisa gerar a resposta no próprio Servlet.

farzac

Bom dia gomesrod

Voce pode dar uma exemplo?

gomesrod

Fazendo de cabeça, a sintaxe pode não estar 100% mas é mais ou menos isso:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
          
        ArquivoCVS arquivoCVS = new ArquivoCVS();  
          
        List<List<String>> linha = new ArrayList<List<String>>();  
        List<String> coluna = new ArrayList<String>();                
        for(int i=0; i<2; i++){  
            coluna.add("teste");  
        }  
        linha.add(coluna);  
          
        arquivoCVS.escreverArquivo("/home/farzac/Server/glassfish3/glassfish/domains/domain1/applications/ProjArquivoTexto/cons_config_exec.csv", linha);

        response.setContentType("text/plain");
        response.setHeader("Content-Disposition", "attachment; filename=cons_config_exec.csv");

        PrintWriter out = response.getWriter();

        // Agora so precisa enviar o conteudo direto para a saida, sem redirect.
        // O jeito de pegar esse conteudo depende da aplicacao... talvez o objeto arquivoCVS tenha em algum lugar, ou talvez precise ler do arquivo...
        // Tambem pode fazer out.println a cada linha, é até melhor porque não acumula o arquivo inteiro na memória.
        // Tem várias maneiras
        // Um exemplo supondo que o CSV esteja em uma variavel String chamada conteudoArquivo:
        out.print(conteudoArquivo);

        out.flush();
    }

A propósito… a gravação desse arquivo é mesmo necessária (ou seja, precisa ficar no servidor depois)? Ou era só uma gambiarra para fazer o redirect?

farzac

Boa tarde Amigos

Deu certo o processo de gravar as informações em um arquivo.

Porem o arquivo csv esta sendo gravado com caracteres alterados.

Esta??o ao inves de Estação

A minha duvida é, preciso ajustar meu processo para corrigir o caracter no momento que busco a informação atraves de uma pagina ou no momento que eu for salvar o arquivo preciso salvar de forma correta?

public void escreverArquivo(String file, List<List<String>> resposta) throws IOException {  
        boolean anexar = false;  
        File f = new File(file);  
        if (f.length() != 0L)  
            anexar = true;  
        FileWriter writer = new FileWriter(new File(file), anexar);  
        BufferedWriter bufferedWriter = new BufferedWriter(writer);  
  
        for (List<String> linha : resposta) {  
            for (String elemento : linha) {  
                bufferedWriter.write(elemento);  
                bufferedWriter.write(";");
            }  
            bufferedWriter.write("\n");
        }  
        bufferedWriter.flush();
        writer.close();
        bufferedWriter.close();  
    }

E o processo para abrir segue abaixo:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/csv;charset=UTF-8"); 
		response.setHeader("text/csv", "attachment; filename=Arquivo.csv"); 
		response.sendRedirect("/ProjArquivoTexto/Arquivo.csv");
		
	}
Criado 15 de julho de 2011
Ultima resposta 21 de jul. de 2011
Respostas 4
Participantes 2