Força o download de um arquivo no servidor da Web – ASP .NET C #

Eu preciso forçar o início do download de um arquivo .sql, quando o usuário clica em um botão no meu aplicativo da Web baseado em ASP.NET (C #).

Como em, quando o botão é clicado, uma checkbox de diálogo Salvar como deve abrir no final do cliente …

Como eu faço isso?

EDITAR

Este é o código que estou usando

string sql = ""; using (System.IO.StreamReader rdr = System.IO.File.OpenText(fileName)) { sql = rdr.ReadToEnd(); } Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", "attachment; filename=Backup.sql"); Response.Write(sql); Response.End(); 

Este é o erro que estou recebendo …

texto alternativo http://img40.imageshack.us/img40/2103/erroro.gif

O que está errado?

Crie um manipulador HTTP separado (https://stackoverflow.com/questions/873207/force-download-of-a-file-on-web-server-asp-net-c-sharp/DownloadSqlFile.ashx):

 < %@ WebHandler Language="C#" Class="DownloadHandler" %> using System; using System.Web; public class DownloadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { var fileName = "myfile.sql"; var r = context.Response; r.AddHeader("Content-Disposition", "attachment; filename=" + fileName); r.ContentType = "text/plain"; r.WriteFile(context.Server.MapPath(fileName)); } public bool IsReusable { get { return false; } } } 

Em seguida, faça o botão na sua página ASP.NET navegar para https://stackoverflow.com/questions/873207/force-download-of-a-file-on-web-server-asp-net-c-sharp/DownloadSqlFile.ashx .

Você precisa dizer ao navegador que o que você está enviando não é html e não deve ser exibido como tal no navegador. O código a seguir pode ser usado para retornar algum texto em seu código do lado do servidor e ele apresentará o diálogo de salvamento para o usuário como você queria:

 Response.Clear(); //eliminates issues where some response has already been sent Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); Response.Write(yourSQL); Response.End(); 

filename : o nome que você deseja dar

yourSQL : o conteúdo do arquivo sql

O problema é que você está usando o código na mesma página que está atualmente carregado no navegador. Você está tentando modificar o stream e a disposição da resposta da página carregada atual. Em vez disso, crie um HttpHandler separado, conforme sugerido por Mehrdad. Então, ao clicar no botão, você invocará o URL para o manipulador. O botão pode até ser um hiperlink simples que tinha o seguinte como o URL de origem:

 Download SQL 

Faz sentido? O ponto é que você não pode modificar a resposta da página já carregada . Inicie uma nova solicitação usando um manipulador para fazer o trabalho.

Adicione um Response.Clear antes de Response.Write para corrigir o erro, se indicado corretamente na checkbox de diálogo do Google Chrome.

Então, para integrar no trecho de outra resposta …

 //add this Reponse.Clear(); //from other answer Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); Response.Write(yourSQL); Response.End; 

A solução abaixo funciona para mim

 string fileNameAndExtension = "thisFile.pdf"; string fullPath = "../folder/files/" + fileNameAndExtension; Response.Clear(); Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension ); Response.TransmitFile(fullPath); Response.End();