ブラウザからファイルをダウンロードさせるために次のようなコードで処理すると、ファイル名に半角空白が含まれている場合に半角空白が+に置き換わってしまいます。
string sourceFile = @"D:\sample.dat"; string fileTitle = HttpUtility.UrlEncode("ダウンロード ファイル名.dat"); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + fileTitle); Response.Flush(); Response.WriteFile(sourceFile); Response.End();
原因はASP.NETのUrlEncodeの処理と、ブラウザ側のURLエンコードの処理が異なる事にあります。.NETのUrlEncodeは半角空白を+にエンコードしますが、逆にInternet Explroerは+を半角空白にデコードしません。
次のような行を追加して、UrlEncodeした文字列に含まれている+を%20に置き換えてしまえば解決します。
fileTitle = fileTitle.Replace("+", "%20");
混乱の原因はRFC1738→RFC1808→RFC2396→RFC3986と度々変更されたURLの仕様と、World Wide Web Consortium(W3C)のHTML4移行の仕様にあるFORMで入力したデータをエンコーディングに関する仕様の不整合にあるようです。
HTML4移行の仕様ではFORMに入力した空白を+に置き換える事が定義されてます。ASP.NETのUrlEncodeはFORMで使用するデータのエンコードを前提として実装しているため空白を+に置き換えているのに対して、Internet ExplorerはRFC2396まではURLで使用を認められてきた+をそのまま通す仕様になっている・・・と言う事のようです。UrlEncodeの仕様はどのレベルRFCに準拠するのか、FORMでの変換ルールに従うか否かといった、開発者の考え方によって様々な実装が生まれているのが現状です。
よってUrlEncodeを使う場合には、相手側の実装がどうなっているかを都度テストして合わせていく必要があります。なんとも混沌としていて残念な限りです。