none
Fazer Download utilizando BinaryWrite RRS feed

  • Pergunta

  • Boa tarde a todos.

    Estou precisando gerar um arquivo texto, na verdade, arquivo de remessa de boletos.

    Consigo gerar ele perfeitamente, tanto criando um arquivo físico no servidor, ou criando um memorystream e baixando pelo binarywrite etc...

    porém o Response.End() , mais uma vez é o problema.

    Response.Buffer = true;
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("content-disposition", "attachment;filename=" + nomeArquivo);
    Response.Charset = "";            
    Response.BinaryWrite(arq.ToArray());
    Response.End();
    Quando o end é executado, ele para a execução da página, fazendo com que os scripts ( atualizações de componentes, geração de mensagens, refreshs em geral ) nao sejam executados.
    um simples Label1.Text = "Funcionou"; não é executado.

    Tirando o End() e usando Flush() , fica muito bom , tudo é executado normalmente e o usuário tem uma experiência muito boa com a tela,
    até o momento em que ele envia o boleto para o banco.

    Se o Response.End() não for usado, o arquivo recebe, além dos meus registros, o innerhtml da página em aberto.

    exemplo de arquivo gerado sem Response.End();
    linha 1 
    linha 2
    linha 3
    linha 4
    
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head><title>
    
    </title><link rel="Stylesheet" href="../Estilo/StyleSheet.css" type="text/css" /><style type="text/css">
    	.ctl00_mnPrincipal_0 { background-color:white;visibility:hidden;display:none;position:absolute;left:0px;top:0px; }
    	.ctl00_mnPrincipal_1 { color:Black;font-family:tahoma;font-size:14px;text-decoration:none; }
    	.ctl00_mnPrincipal_2 { color:Black;background-color:#E0E0E0;border-color:Black;border-width:1px;border-style:Solid;font-family:tahoma;font-size:14px;width:98%; }
    	.ctl00_mnPrincipal_3 {  }
    	.ctl00_mnPrincipal_4 { border-color:Black;padding:2px 5px 2px 5px; }
    	.ctl00_mnPrincipal_5 { background-color:#E0E0E0;border-color:Black;border-width:1px;border-style:Solid; }
    	.ctl00_mnPrincipal_6 {  }
    	.ctl00_mnPrincipal_7 { border-color:Black;padding:2px 5px 2px 5px; }
    	.ctl00_mnPrincipal_8 { background-color:#E0E0E0;border-color:Black;border-width:1px;border-sty
    já mudei Content-type, char-set, ja tentei usar HttpContext.Current.ApplicationInstance.CompleteRequest() e nada.
    Nem que eu coloque um Response.End() no final do metodo, mas sem o end . não funciona de forma alguma.

    algumas coisas devem ser feitas depois que o arquivo foi salvo na máquina do cliente, não posso deixar o end no final do metodo , pois se der erro em alguma parte do metodo, nenhum tipo de erro é mostrado, apenas uma pagina branca, devido ao disparo do End() solto.

    Alguma idea galera?

    Abraços.


    terça-feira, 11 de agosto de 2009 19:40

Respostas

  • Olá Juarez,

    Eu já fiz isso várias vezes e olhando para o seu código, faltou apenas colocar um "Response.Clear()" na primeira linha.
    Desta forma, qualquer texto/header relacionado com a sua página será removido permanecendo apenas o conteudo que vc escrever no "Respose.BinaryWrite()"

    Espero ter ajudado.
    Se não funcionar, posta aqui para que possamos te ajudar.
    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0
    Se Eu consegui te ajudar, poderia marcar como "Respondido" ? Grato. :)
    • Sugerido como Resposta Rafael F P terça-feira, 11 de agosto de 2009 19:57
    • Marcado como Resposta Juarez Fernandes quarta-feira, 12 de agosto de 2009 13:01
    terça-feira, 11 de agosto de 2009 19:56

Todas as Respostas

  • Olá Juarez,

    Eu já fiz isso várias vezes e olhando para o seu código, faltou apenas colocar um "Response.Clear()" na primeira linha.
    Desta forma, qualquer texto/header relacionado com a sua página será removido permanecendo apenas o conteudo que vc escrever no "Respose.BinaryWrite()"

    Espero ter ajudado.
    Se não funcionar, posta aqui para que possamos te ajudar.
    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0
    Se Eu consegui te ajudar, poderia marcar como "Respondido" ? Grato. :)
    • Sugerido como Resposta Rafael F P terça-feira, 11 de agosto de 2009 19:57
    • Marcado como Resposta Juarez Fernandes quarta-feira, 12 de agosto de 2009 13:01
    terça-feira, 11 de agosto de 2009 19:56
  • Na hora de copiar o código, eu pulei o clear. Desculpa ai cara.

    Existe o clear, já tentei separ o Clear em ClearHeaders e ClearContent, mesmo assim não funciona.

    Negligenciei duas informações também.

    Este formulário está com o botão que gera o arquivo, dentro de um updatePanel, por isso existe uma trigger para que o response trabalhe sem dar erro ao tentar fazer  o download.


    terça-feira, 11 de agosto de 2009 20:31
  • Cara de uma olhada neste artigo que fiz, se te ajuda.

    http://adrianocavalari.spaces.live.com/blog/cns!63751919C493AF21!286.entry


    Abs
    Se alguem ajudou não esqueça de pontuar. Blog sobre programação http://adrianocavalari.spaces.live.com/
    terça-feira, 11 de agosto de 2009 21:51
  • Agora lendo com calma o seu post, percebi algumas coisas.

    Quando vc está utilizando este "meio" para gerar o seu arquivo, esta lógica não poderá ficar na mesma página que o usuário clica no botão, isso se alguma informação precisar ser atualizada.

    Ao utilizar o Response.End() todos os dados são imediatamente enviados para o servidor.

    Tenta fazer o seguinte:
    1. Coloca a lógica de geração do arquivo em novo ASPX;
    2. No ASPX que o usuário clica no botão, faz as atualizações da forma que você precis;
    3. Após atualizar as informações desejadas, utiliza um Page.ClientScript.RegisterStartupScript() abrir uma nova janela;
    4. Esta janela que será aberta ( no passo 3 ) deverá ser a nova página criada no passo 1;

    Desta fora, você atualiza a página atual com as informações e alertas desejadas e ainda coloca o usuário para fazer o "download" do arquivo.

    Da uma tentada desta forma e se mesmo assim não funcionar, avisa aki para que possamos te ajudar.

    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0
    Se Eu consegui te ajudar, poderia marcar como "Respondido" ? Grato. :)
    quarta-feira, 12 de agosto de 2009 01:21
  • Rafael, esta forma de download, é a encontrada nas páginas MS, ou em geral, paginas php, correto ?
    o problema maior disso , apesar de ser a melhor solução até hj, é não ter o controle de baixa do arquivo, ou seja, se conseguiu baixar ou nao o arquivo.

    Mas vou fazer isso.

    Melhor forma que consegui até agora, foi Response.Flush() e Response.Close() no final do metodo ( não havia testado o Close, e achei q tinha), mas mesmo assim não executa os passos posteriores, como funções para limpar tela, trocar labels, alerts etc..

    Se não houver outra forma é perguntar o usuário se o arquivo foi baixado, né?

    Grato.

    Juarez.
    quarta-feira, 12 de agosto de 2009 12:32
  • Realmente, seria melhor se fosse possível controlar se o usuário terminou de fazer o download ou não.

    Mas ao utilizar o "Response.Clear()" todo o processamento realizado anteriormente pela página será removido. Ao utilizar o "Response.End()" nenhum outro processamento, posterior a este comando, será enviado para o usuário. Como é relazado o "Response.BinaryWrite()" indica que não será texto enviado para o usuário.


    Infelizmente, não é possível realizar as duas coisas ao mesmo tempo ( tbem acho que isso seja uma pena ) mas, no final, até que faz sentido pra mim. O navegador do usuário não consegue "entender" um arquivo e um HTML enviados ao mesmo tempo.


    Bom, espero ter consiguido ajudar de alguma forma.

    Qualquer duvida, posta aqui para que possamos te ajudar.
    Rafael F. P.
    MTS em Aplicações WEB c/ .NET 2.0
    Se alguém consegui te ajudar, poderia marcar como "Respondido" ? Grato. :)
    quarta-feira, 12 de agosto de 2009 12:48
  • Ajudou sim.

    Muito grato cara.

    quarta-feira, 12 de agosto de 2009 12:59