强制下载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();