
webシステムで、保存ダイアログを表示させ、ファイル名に半角スペースの入ったzipファイルをダウンロードしようとしているのですが、保存ダイアログが表示された際、
・IEだと半角スペースが+に変換される。
・chromeだと保存ダイアログすら表示されない。
・Firefoxだと半角スペースを含む以降の文字(拡張子も)が削除される。
となってしまいます。
実際、コードの修正で半角スペースの入ったzipファイル名等を、ダウンロードすることができるのでしょうか。
あれば、是非教えて頂きたいです。
コードは
Response.AddHeader("Content-Disposition", "attachment; filename=" + _FNM.ToString());
_FNMはファイル名を指定しています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


退会済みユーザー
2016/09/16 12:29

回答5件
0
ベストアンサー
ブラウザのバージョンは何ですか?(「情報の追加・修正の依頼をする」でブラウザのバージョンを聞いたのですが)
今、Vista SP2 のノートパソコンしか使えない(なので、ブラウザは IE9, Firefox 48.0.2, Chrome 49.0.2623.112 m)自分がレスするのも何ですが・・・
ASP.NET Web Forms アプリで、例えば以下のように設定されたファイル名の空白を、IE が勝手に + に変えるということはないはずです。(少なくとも自分の環境の IE9 ではそういうことはない)
HttpResponse.AppendHeader("Content-Disposition", "attachment;filename=file name.txt");
_FNMはファイル名を指定しています。
とのことですが、ひょっとして、日本語対応のため、オリジナルのファイル名を UrlEncode したものが _FNM ということはないですか? UrlEncode すると半角空白は + に変換されます。
例えば、上の file name.txt を UrlEncode すると file+name.txt になり、当然 IE はファイル名を file+name.txt と解釈します。それを見て、
・IEだと半角スペースが+に変換される。
と言っているということはありませんか? その場合、Firefox と Chrome の結果が解せませんが、Content-Type の指定が間違っているとか、User-Agent を見て何か変えているということはないですか?
ちなみに、自分の環境で以下のコードの HTTP ハンドラを作って、それを各ブラウザから呼び出してみましたが、IE9 と Chrome 49 は問題なく file name.txt というファイル名になります。
Firefox 48 は file というファイル名になってしまいますが。
<%@ WebHandler Language="C#" Class="_0039_DownloadHandler" %> using System; using System.Web; public class _0039_DownloadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { HttpResponse response = context.Response; HttpRequest request = context.Request; response.Clear(); response.ContentType = "text/plain"; // キャッシュを許可しない response.Cache.SetCacheability(HttpCacheability.NoCache); response.Cache.SetExpires(DateTime.Now.ToUniversalTime()); response.Cache.SetMaxAge(new TimeSpan(0, 0, 0, 0)); response.AppendHeader("Content-Disposition", "attachment;filename=file name.txt"); response.Write("こんにちは世界!"); } public bool IsReusable { get { return false; } } }
【追伸】
プロキシを使っているとすると、プロキシが勝手にヘッダを書き換えているというようなことがないかも調べた方がよさそうです。
【追伸2】
一度 Fiddler などのキャプチャツールを使って応答を見てください。
上のコードの場合、以下の応答になります。filename=file name.txt はプログラムで設定した通りになるはずで、それが IE で受信されて空白が + に変わるということは考えにくいです。
最初から応答ヘッダで filename=file+name.txt となっているということはないですか?
HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Type: text/plain; charset=utf-8 Expires: -1 Server: Microsoft-IIS/7.0 Content-Disposition: attachment;filename=file name.txt X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Sun, 18 Sep 2016 01:56:26 GMT Content-Length: 24 こんにちは世界!
投稿2016/09/17 01:27
編集2016/09/18 02:03
退会済みユーザー
総合スコア0
0
ヘッダ指定ではなくて、<a download>
属性で指定してみるのはどうでしょうか(IE、Safariには効きませんが)。
投稿2016/09/16 10:43
総合スコア146581
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
RFC 6266 に従って、URLエンコードするのはどうでしょうか。 C#に詳しくないけど、ここによると、以下のようなコードになりそうです。
C#
1string encodedFileName = context.Server.UrlEncode(_FNM.ToString()); 2encodedFileName = encodedFileName.Replace("+", "%20"); 3Response.AddHeader("Content-Disposition", 4 "attachment;filename*=utf-8''" + encodedFileName);
参考サイトによると、2行目の Replace は UrlEncode が空白を "%20" ではなく、 "+" にするらしいので、必要だということです。
参考サイトは古い記事なので、RFC6266 をサポートしていないブラウザが多いので、いまいちのような評価でしたが、今ならいけるってことはないですかね?
投稿2016/09/16 09:49
総合スコア3401
0
ファイル名の中にスペースが含まれている場合には、ファイル名全体をダブルクオーテーション(")で括ってください。
質問のコードの場合には、以下のように書き換えます。
C#
1Response.AddHeader("Content-Disposition", "attachment; filename=\”" + _FNM.ToString() +”\””);
ダブルクオーテーションは、文字列の始まりと終わりを示すのに使われていますから、文字列の中で使うにはエスケープ文字()を付けます。
投稿2016/09/16 08:47
総合スコア6919
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。