Webからサーバ上にあるファイルをダウンロードしたいという場合があります。
この場合、ContentTypeとファイル名をただしく設定し、ダウンロードするファイルをResponseストリームの中に書きだせばOKです。
以下はWordファイルをダウンロードするサンプルです。
#ファイル名を日本語にすると化けてしまいます。
Web.configの設定でうまくいく、という情報もあるのですが、手元では正しく動かせていません。
-------------------------------------------------------
<%@ Page Language="C#" %>
<html>
<head>
<script runat="server">
void button_Click(object sender, EventArgs e)
{
Response.ContentType="application/ms-word";
Response.AddHeader("content-disposition","attachment; filename=sample.doc");
Response.WriteFile("sample.doc");
Response.End();
}
</script>
</head>
<body>
<form runat="server">
<asp:button id="Button1" Text = "ファイルダウンロード" runat="server" OnClick="button_Click" />
</form>
</body>
</html>
-------------------------------------------------------
注意する必要があるのは、Response.End()を利用してストリームの書き込みをこの時点で中断することです。
この処理を行わないと、ダウンロードしたファイルの最後にこのaspxファイルが生成するHTMLの内容が書き込まれてしまいます。
#この動作により、プログラムからResponseストリームに書き込むのはaspxファイルがHTMLを生成するより前、ということがわかります。
なお、ファイルのダウンロードのちょっとした応用で次のようなことも可能です。
ExcelがHTMLを解釈できることを利用したサンプルです。
-------------------------------------------------------
<%@ Page Language="C#" %>
<html>
<head>
<script runat="server">
void button_Click(object sender, EventArgs e)
{
Response.ContentType="application/ms-excel";
Response.AddHeader("content-disposition","attachment; filename=sample.xls");
Response.Write("<html>");
Response.Write("<body>");
Response.Write("<table border=1>");
Response.Write("<tr><td>test1-1</td><td>test1-2</td><td>test1-3</td></tr>");
Response.Write("<tr><td>test2-1</td><td>test2-2</td><td>test2-3</td></tr>");
Response.Write("<tr><td style='color: red;'>test3-1</td><td>");
Response.Write( DateTime.Now );
Response.Write("</td><td>test3-3</td></tr>");
Response.Write("</table>");
Response.Write("</body>");
Response.Write("</html>");
Response.End();
}
</script>
</head>
<body>
<form runat="server">
<asp:button id="Button1" Text = "ファイルダウンロード" runat="server" OnClick="button_Click" />
</form>
</body>
</html>
-------------------------------------------------------
追記:
ダウンロードするファイルに日本語を利用したい場合の方法がGotDotNet JapanのMLで紹介されていました。
-------------------------------------------------------
<%@ Page Language="C#" %>
<html>
<head>
<script runat="server">
void button_Click(object sender, EventArgs e)
{
Response.ContentType="application/ms-word";
string fname = System.Web.HttpUtility.UrlEncode("てすと.doc");
Response.AddHeader("content-disposition","attachment; filename=" + fname);
Response.WriteFile("sample.doc");
Response.End();
}
</script>
</head>
<body>
<form runat="server">
<asp:button id="Button1" Text = "ファイルダウンロード" runat="server" OnClick="button_Click" />
</form>
</body>
</html>
-------------------------------------------------------
上記のように、利用するファイル名をUrlEncodeしてあげればOKです。
あおい情報システム株式会社 小野修司(どっとねっとふぁん)