随分古い情報ですが、ASP.NET で作成した Web アプリケーションで日本語を含むファイル名のファイルをダウンロードするときに、ファイル名の文字化けが発生するときの回避策を紹介します。動作確認は以下の環境で行っております。
スポンサーリンク
| OS | Windows XP |
|---|---|
| ブラウザ | IE 6 |
| Web サーバー | IIS 7.0 |
URL エンコード
日本語ファイル名の文字化けを回避するには、URL エンコードをすることで文字化けを回避することができます。以下はサンプルコードです。
VB.NET
Dim filePath As String = "e:\ファイル名.txt"
Dim fileName As String = "ダウンロード.txt"
Dim resp As HttpResponse = HttpContext.Current.Response
'コンテントタイプを指定する
resp.ContentType = "application/octet-stream"
'URLエンコードを行わないと、日本語のファイル名が文字化けする
resp.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName))
'resp.AddHeader("Content-Disposition", "attachment; filename=" + fileName)
resp.WriteFile(filePath)
resp.Flush()
resp.End()
C#
string filePath = @"e:\ファイル名.txt";
string fileName = @"ダウンロード.txt";
HttpResponse resp = HttpContext.Current.Response;
//コンテントタイプを指定する
resp.ContentType = @"application/octet-stream";
//URLエンコードを行わないと、日本語のファイル名が文字化けする
resp.AddHeader(@"Content-Disposition", @"attachment; filename=" + HttpUtility.UrlEncode(fileName));
//resp.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
resp.WriteFile(filePath);
resp.Flush();
resp.End();
日本語ファイル名は URL エンコードする必要がありますので、HttpUtility.UrlEncode メソッドを使用して行っています。ファイル名に日本語を含む場合に URL エンコードを行わないと 「開く」「保存」ダイアログ内のファイル名が文字化けします。しかし、URL エンコードを行ってダイアログ内のファイル名が文字化けしていなくても「開く」ボタンで開いたときにファイル名が文字化けする可能性があります。詳細は以下のリンクよりご確認ください。
上記参考サイトによると、web.config に globalization 要素を追加することで文字化けを回避できるようになります。
Web.config
<system.web>
<globalization responseHeaderEncoding="shift-jis" />
</system.web>
IIS マネージャからの設定手順は、[IIS マネージャ] - [.NET グローバリゼーション] - [エンコード / 応答のヘッダー] で shift_jis を設定します。
この状態でさらに、上記で行った URL エンコード処理 ( HttpUtility.UrlEncode ) を外す必要があります。これは注意するポイントです。なお、IIS サーバーで実行した場合のみ responseHeaderEncoding 設定が有効になりますので、ローカルデバッグ環境では文字化けしたままの状態となります。IIS サーバー上で動作させれば文字化けしないのですが、開発者サイドとしては、やりにくいことは間違いありません。