我需要强制开始下载一个.sql文件,当用户单击我的ASP .NET (C#)基于web应用程序中的一个按钮。
与在中一样,当单击按钮时,应在客户端打开一个另存为对话框...
我该怎么做呢?
编辑
这是我正在使用的代码
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();
这就是我得到的错误...
alt text http://img40.imageshack.us/img40/2103/erroro.gif
怎么了?
发布于 2009-05-16 20:29:08
创建单独的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页面中的按钮导航到DownloadSqlFile.ashx
。
发布于 2009-05-16 20:24:47
你需要告诉浏览器你发送的不是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
:您希望为其指定的名称
sql:yourSQL
文件的内容
发布于 2009-05-16 21:23:38
问题是,您使用的代码与浏览器中当前加载的代码相同。您正在尝试修改当前加载的页面的响应流和部署。应按照Mehrdad的建议创建一个单独的HttpHandler。然后单击该按钮,您将调用指向处理程序的URL。该按钮甚至可以是一个简单的超链接,具有以下内容作为源URL:
<a href="DownloadSqlFile.ashx">Download SQL</a>
讲得通?关键是,您不能修改已经加载的页面的响应。使用处理程序启动一个新请求来完成此工作。
https://stackoverflow.com/questions/873207
复制相似问题