ユーザーが私の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
どうしましたか?
別の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();