質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

5回答

10828閲覧

半角スペースの入ったファイル名をダウンロードしようとすると、正しくダウンロードできない

asr

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

1グッド

0クリップ

投稿2016/09/16 08:30

webシステムで、保存ダイアログを表示させ、ファイル名に半角スペースの入ったzipファイルをダウンロードしようとしているのですが、保存ダイアログが表示された際、

・IEだと半角スペースが+に変換される。
・chromeだと保存ダイアログすら表示されない。
・Firefoxだと半角スペースを含む以降の文字(拡張子も)が削除される。

となってしまいます。

実際、コードの修正で半角スペースの入ったzipファイル名等を、ダウンロードすることができるのでしょうか。
あれば、是非教えて頂きたいです。

コードは
Response.AddHeader("Content-Disposition", "attachment; filename=" + _FNM.ToString());

_FNMはファイル名を指定しています。

mit0223👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/16 12:27 編集

ブラウザのバージョンは何ですか?
退会済みユーザー

退会済みユーザー

2016/09/16 12:29

投稿できないのでやり直し
guest

回答5

0

空白込みのファイル名にこだわるのは、UNIX/Linuxでマルチバイト文字を含んだファイル名を使うことに情熱を費やすのと同じで、止めた方が良いです。
もっと建設的な方向にエネルギーを傾けましょう。

投稿2016/09/16 09:57

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asr

2016/09/16 10:10

返答ありがとうございます。 お客さんの要望だったので、どうにかできる内容が無いかと模索していた次第です。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asr

2016/09/21 01:29

返信遅れて申し訳ございません。 ソースを再度確認してみると、ファイル名をUrlEncodeしていました。 もう一度ソースを含め、SurferOnWwwさんのところを色々調べてみます。 ありがとうございます。
guest

0

ヘッダ指定ではなくて、<a download>属性で指定してみるのはどうでしょうか(IE、Safariには効きませんが)。

投稿2016/09/16 10:43

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asr

2016/09/16 10:02

返答ありがとうございます。早速試してみました。 結果は、 IE:半角スペースが+に変換。 chrome:IEと同じく半角スペースが+に変換。 firefox:半角スペースが削除された状態のファイル名に変換(拡張子は残る)。 やはりこうなるようです。
guest

0

ファイル名の中にスペースが含まれている場合には、ファイル名全体をダブルクオーテーション(")で括ってください。

質問のコードの場合には、以下のように書き換えます。

C#

1Response.AddHeader("Content-Disposition", "attachment; filename=\”" + _FNM.ToString() +”\””);

ダブルクオーテーションは、文字列の始まりと終わりを示すのに使われていますから、文字列の中で使うにはエスケープ文字()を付けます。

投稿2016/09/16 08:47

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asr

2016/09/16 09:15

素早い返答ありがとうございます。早速試してみました。 結果は、 IE:半角スペースが+に変換。 chrome:IEと同じく半角スペースが+に変換。 firefox:半角スペースが削除された状態のファイル名に変換(拡張子は残る)。 やはり半角スペースを残したり、+を削除したりするのは難しいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問