web-dev-qa-db-ja.com

Webサーバー上のファイルの強制ダウンロード-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();

これは私が得ているエラーです...

代替テキストhttp://img40.imageshack.us/img40/2103/erroro.gif

どうしましたか?

18
Sameet

別の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に移動します。

29
Mehrdad Afshari

送信しているものは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ファイルの内容

18
Neil Trodden

問題は、現在ブラウザにロードされているのと同じページでコードを使用していることです。応答ストリームと現在ロードされているページの処理を変更しようとしています。代わりに、別のページを作成します。 Mehrdadによって提案されたHttpHandler。次に、ボタンをクリックすると、ハンドラーへのURLが呼び出されます。ボタンは、ソースURLとして次のような単純なハイパーリンクにすることもできます。

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

意味がありますか?重要なのは、すでにロードされているページの応答を変更することはできません。ハンドラーを使用して新しいリクエストを起動し、作業を行います。

5
Ryan Farley

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;
1
Greg Ogle

以下の解決策は私のために働きます

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