繁体   English   中英

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

[英]Force download of a file on web server - ASP .NET C#

当用户单击基于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

怎么了?

创建一个单独的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

您需要告诉浏览器您发送的内容不是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文件的内容

问题是您在浏览器中当前加载的同一页面上使用的代码。 您正在尝试修改当前加载页面的响应流和处置。 相反,按照Mehrdad的建议创建一个单独的HttpHandler。 然后在单击按钮时,您将调用处理程序的URL。 该按钮甚至可以是一个简单的超链接,其中包含以下内容作为源URL:

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

合理? 关键是, 您无法修改已加载页面的响应 使用处理程序启动新请求以完成工作。

如果在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;

以下解决方案适合我

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM