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

文書番号: 436616 - 対象製品
この記事は、以前は次の 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 サイトを参照してください。

HttpResponse.HeaderEncoding プロパティ
http://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.headerencoding(v=VS.80).aspx

globalization 要素 (ASP.NET 設定スキーマ)
http://msdn2.microsoft.com/ja-jp/library/hy4kkhe0(VS.80).aspx


以下のサンプル コード (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 - 最終更新日: 2012年1月31日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com