当用户单击基于ASP .NET(C#)的Web应用程序中的按钮时,我需要强制开始下载.sql文件。
在单击按钮时,应在客户端打开另存为对话框...
我该怎么做?
修改
这是我正在使用的代码
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
怎么了?
答案 0 :(得分:29)
创建一个单独的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
。
答案 1 :(得分:18)
您需要告诉浏览器您发送的内容不是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文件的内容
答案 2 :(得分:5)
问题是您在浏览器中当前加载的同一页面上使用的代码。您正在尝试修改当前加载页面的响应流和处置。而是创建一个单独的HttpHandler,如Mehrdad所建议的那样。然后在单击按钮时,您将调用处理程序的URL。该按钮甚至可以是一个简单的超链接,其中包含以下内容作为源URL:
<a href="DownloadSqlFile.ashx">Download SQL</a>
有意义吗?关键是,您无法修改已加载页面的响应。使用处理程序启动新请求以完成工作。
答案 3 :(得分:1)
如果在Chrome对话框中正确说明,请在Response.Clear
之前添加Response.Write
以修正错误。
所以要在其他答案中整合片段......
//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;
答案 4 :(得分:0)
以下解决方案适用于我
transform()