現在オフラインです。再接続するためにインターネットの接続を待っています

ファイルをダウンロードする ASP.NET ページで日本語ファイル名が文字化けする

この記事は、以前は次の ID で公開されていました: JP436616
現象
Microsoft ASP.NET を使用してファイルをダウンロードする以下のような Web ページを作成した場合、ファイル名に日本語を使用すると、文字化けや意図しないファイル名が表示されます。

ASP.NET Web アプリケーションで、送信する HTTP ヘッダーに Content-Disposition を含めると、Microsoft Internet Explorer 5 以降のブラウザではファイルのダウンロード ダイアログ ボックスが開きます。この機能を利用して、以下のようなコード (C#) を含む、.aspx ファイルを Web サーバーに配置します。

Response.AppendHeader("Content-Disposition","attachment; filename=日本語.zip");

Internet Explorer を使用して該当のページを表示すると、ファイルのダウンロード ダイアログ ボックスが開きますが、ファイル名の日本語部分が以下のように文字化けして表示されます。

譌・譛ャ隱杣1].zip

補足 : ASCII 文字セットに含まれる半角英数字のみのファイル名を指定すると正常に表示されます。
原因
Internet Explorer では、Content-Disposition ヘッダーを受信すると、送られてきたコンテンツをそのままブラウザで開かずにファイル ダウンロード ダイアログ ボックスを表示します。

その際に、このヘッダーの filename パラメーターを利用している場合、このパラメーターで渡されたファイル名を保存時の既定ファイル名にします。ただし、日本語版クライアント OS (またはロケールを日本語にしている場合) には、Internet Explorer ではこのパラメーターで渡された文字列を既定の文字コードである Shift-JISとして処理するためにこの現象が発生します。

なお、RFC 6266 (RFC 2231/RFC 5987) に基づき、Content-Disposition ヘッダーに非 ASCII 文字を含む場合、本来は filename* 値にエンコードした値を指定する必要があります。Internet Explorer 9 以降では、このエンコード方式 (UTF-8) をサポートしています。

RFC 6266 (RFC 2231/RFC 5987) の使用方法については、以下のページを参照してください。

RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP) (英語情報)
http://www.ietf.org/rfc/rfc6266.txt

RFC2231: MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations (英語情報)
http://www.ietf.org/rfc/rfc2231.txt

RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters (英語情報)
http://www.ietf.org/rfc/rfc5987.txt
回避策
ASP.NET 1.0 および 1.1 では、HTTP ヘッダーを常に UTF-8 で送信します。前述の通り、Internet Explorer ではファイル名を Shift-JIS として処理するため、ファイル名を正しく表示できません。以下のようにファイル名を UrlEncode() することで問題を回避することができる場合があります。ただし、一部のブラウザでは UTF-8 で UrlEncode() されたファイル名を認識できません。

Response.AppendHeader("Content-Disposition","attachment; filename=" + Server.UrlEncode("日本語.zip"));

ASP.NET 2.0 以降では、Response クラスに HeaderEncoding プロパティが、また、構成ファイル globalization 要素に responseHeaderEncoding 属性が用意されました。これにより ASP.NET を使用して Shift-JIS の HTTP ヘッダーを送信することができます。

HeaderEncoding プロパティ、および globalization 要素については、次のマイクロソフト Web サイトを参照してください。



以下のサンプル コード (C#) では、[Button1] クリック時に日本語ファイルをダウンロードし、多くのブラウザで動作します。

注 : このコードは RFC 6266 には基づいておらず、また、クライアント OS が日本語版以外の場合には問題が生じる恐れがあります。

<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server">    protected void Button1_Click(object sender, EventArgs e)    {        string FileName = "日本語.zip";                Response.Clear();        Response.ContentType = "application/zip";         // ヘッダおよびボディのエンコードを変更します         Response.HeaderEncoding = System.Text.Encoding.GetEncoding("shift_jis");        Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift_jis");        Response.AppendHeader("Content-Disposition", "Attachment; filename=" + FileName);         // 一部のブラウザ対応         Response.Write(FileName.ToString());         // 物理ファイルを転送する場合は TransmitFile() が有用です         Response.TransmitFile(Server.MapPath("./日本語.zip"));        Response.End();    }</script> <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    <title></title></head><body>    <form id="form1" runat="server">        <asp:Button ID="Button1" runat="server" Text="Download" onclick="Button1_Click" />    </form></body></html>

Internet Explorer 9 等の最新ブラウザの多くは RFC 6266 (RFC 2231/RFC 5987) をサポートしています。もし、日本語版以外のクライアント OS や RFC への準拠を考慮する場合には、以下のコードを検討してください。

Response.AppendHeader("Content-Disposition", "Attachment; filename*=utf-8''" + Server.UrlEncode(FileName));>
プロパティ

文書番号:436616 - 最終更新日: 01/31/2012 08:34:00 - リビジョン: 4.0

Microsoft ASP.NET 1.0, Microsoft ASP.NET 1.1, Microsoft ASP.NET 2.0, Microsoft ASP.NET 4.0

  • kbexpertiseadvanced kbtshoot KB436616
フィードバック