强制下载Web服务器上的文件 – ASP .NET C#

当用户单击基于ASP .NET(C#)的Web应用程序中的button时,我需要强制开始下载.sql文件。

如在单击该button时,另存为对话框应在客户端打开…

我如何做到这一点?

编辑

这是我正在使用的代码

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(); 

这是我得到的错误…

替代文字http://img40.imageshack.us/img40/2103/erroro.gif

怎么了?

创build一个单独的HTTP处理程序(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; } } } 

然后使您的ASP.NET页面中的button导航到DownloadSqlFile.ashx

你需要告诉浏览器你发送的不是html,不应该在浏览器中显示。 下面的代码可以用来返回服务器端代码中的一些文本,并且会按照你的意愿向用户显示保存对话框:

 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 :你想给它的名字

yourSQL :sql文件的内容

问题是,您正在使用浏览器中当前加载的相同页面上的代码。 您正在尝试修改响应stream并处理当前加载的页面。 相反,按照Mehrdad的build议,创build一个单独的HttpHandler。 然后点击button,您将调用处理程序的URL。 该button甚至可以是一个简单的超链接,具有以下作为源URL:

 <a href="DownloadSqlFile.ashx">Download SQL</a> 

合理? 问题是, 你不能修改已经加载的页面的响应 。 使用处理程序启动一个新的请求来完成这项工作。

如果在Chrome对话框中正确声明,请在Response.Clear之前添加一个Response.Clear来修复错误。

所以要集成在其他答案的片段…

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

下面的解决scheme适用于我

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