Force download of a file on web server - ASP .NET

2019-01-04 02:56发布

I need to force the initiation of download of a .sql file, when user clicks a button in my ASP .NET (C#) based web application.

As in, when the button is clicked, a save as dialog should open at the client end...

How do I do this?

EDIT

This is the code I am using

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

This is the error that I'm getting...

alt text http://img40.imageshack.us/img40/2103/erroro.gif

What's wrong?

5条回答
Evening l夕情丶
2楼-- · 2019-01-04 03:12

The problem is that you're using the code on the same page as is currently loaded in the browser. You are attempting to modify the response stream and disposition of the current loaded page. Instead, create a separate HttpHandler, as suggested by Mehrdad. Then on the click of the button, you will invoke the URL to the handler. The button could even be a simple hyperlink that had the following as the source URL:

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

Make sense? The point being, you cannot modify the response of the already loaded page. Launch a new request using a handler to do the work.

查看更多
家丑人穷心不美
3楼-- · 2019-01-04 03:24

Add a Response.Clear before you Response.Write to fix the error, if stated properly in the Chrome dialog.

So to integrate in the snippet in other answer...

//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楼-- · 2019-01-04 03:25

You need to tell the browser that what you are sending is not html and shouldn't be displayed as such in the browser. The following code can be used to return some text in your server-side code and it will present the save dialog to the user as you wanted:

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: the name you wish to give it

yourSQL: the content of the sql file

查看更多
闹够了就滚
5楼-- · 2019-01-04 03:28

The solution below works for me

string fileNameAndExtension = "thisFile.pdf";     
string fullPath = "../folder/files/" + fileNameAndExtension;       
Response.Clear();
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension );
Response.TransmitFile(fullPath);
Response.End();
查看更多
你好瞎i
6楼-- · 2019-01-04 03:31

Create a separate HTTP Handler (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; } }
}

Then make the button in your ASP.NET page navigate to DownloadSqlFile.ashx.

查看更多
登录 后发表回答