みみたんのメモWiki
ASP.NET2.0によるファイルダウンロード
最終更新:
mimitan
-
view
ASP.NET 2.0 によるファイルダウンロード
ちょっと前から自宅サーバーにて友人向けのこじんまりとしたアップローダーをやっているのですが、
その中でファイルをアップロードしたときのファイル名のままダウンロードができるようになっているのです。
私が作ったときも苦労しましたが、MSDNのフォーラムとかみてると結構日本語のファイル名が文字化けをしてしまって、
困っている方が多そうなのでダウンロードの部分だけサンプルとして公開することにしました。
その中でファイルをアップロードしたときのファイル名のままダウンロードができるようになっているのです。
私が作ったときも苦労しましたが、MSDNのフォーラムとかみてると結構日本語のファイル名が文字化けをしてしまって、
困っている方が多そうなのでダウンロードの部分だけサンプルとして公開することにしました。
実は、IEだと日本語がファイル名に含まれていると文字化けをするのですが、
私は最初Firefoxで作っていたのでぜんぜん気付かず公開した後に自分で試してみて分かったわけですが、
どうも、IEはHTTPのヘッダの部分を.NETの標準である、UTF-8での日本語の指定がいけないようで、
なのでヘッダをSJISにしてやることによってOKです。(多分)
FirefoxはUTF-8でも全くもって大丈夫なのですがぁ。。。
ただ、この方法だと日本語以外の環境だと多分また文字化けをするのではと思っているのです。
やってないのでわからないし、やる気もないのでそこまでにしてます。
私は最初Firefoxで作っていたのでぜんぜん気付かず公開した後に自分で試してみて分かったわけですが、
どうも、IEはHTTPのヘッダの部分を.NETの標準である、UTF-8での日本語の指定がいけないようで、
なのでヘッダをSJISにしてやることによってOKです。(多分)
FirefoxはUTF-8でも全くもって大丈夫なのですがぁ。。。
ただ、この方法だと日本語以外の環境だと多分また文字化けをするのではと思っているのです。
やってないのでわからないし、やる気もないのでそこまでにしてます。
Response.Clear();
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("SJIS");
Response.ContentType = mimetype;
Response.AppendHeader("Accept-Ranges", "bytes");
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
Response.AppendHeader("Content-length", fileSize);
Response.TransmitFile(filePath);
//-----変数の説明-------------------------------------------------------------------
//mimetype : アップしたときのMIMETYPEです。
// 不明な場合は、多分他のサイトにも書いてあるように「application/octet-stream」で大丈夫だと。
//
//fileName : ファイル名(ダウンロードする際のファイル名)
// これがよく文字化けする原因。
//
//filePath : ファイルパス(ダウンロードするファイルパスですよ。)
多分こんな感じでいいのだと思いますがぁ。。。
一応、IE7、IE6では大丈夫でした。当然日本語環境のパソコンですがぁ。。。
MIMETYPEをしているのかというと携帯電話でダウンロードがうまく行かないからです。
一応、私が持っているSoftBank 705SHではファイルサイズが大丈夫ならば、
MIMETYPEがきちんと指定された画像とテキストファイルはダウンロードできました。
けれども残念ながらファイル名はURLの最後になってしまうようです。
一応、IE7、IE6では大丈夫でした。当然日本語環境のパソコンですがぁ。。。
MIMETYPEをしているのかというと携帯電話でダウンロードがうまく行かないからです。
一応、私が持っているSoftBank 705SHではファイルサイズが大丈夫ならば、
MIMETYPEがきちんと指定された画像とテキストファイルはダウンロードできました。
けれども残念ながらファイル名はURLの最後になってしまうようです。
参考にして改良をしてもらえればと思います。
よければ改良したソースなどを掲示板に書いてもらったりするとうれしいですね。
でも強制ではないですよ。
よければ改良したソースなどを掲示板に書いてもらったりするとうれしいですね。
でも強制ではないですよ。
2008年07月21日付けのブログで書いたようにソースコードを変更しました。
さらに、問題としてWindows版Safariでは日本語が文字化けします。
いろいろと試してみましたが、できませんでした。
なんかいい対処方法があれば、掲示板でも連絡くれるとうれしいです。
あと、Operaは大丈夫みたいです。
さらに、問題としてWindows版Safariでは日本語が文字化けします。
いろいろと試してみましたが、できませんでした。
なんかいい対処方法があれば、掲示板でも連絡くれるとうれしいです。
あと、Operaは大丈夫みたいです。
- ちょっと追記。後で整理する。(2012/11/07)
HttpContext context;
context.Response.Clear();
context.Response.HeaderEncoding = Encoding.GetEncoding("SJIS"); //IEのファイル名文字化け防止
context.Response.ContentType = "application/octet-stream"; //適当にコンテンツタイプを。
context.Response.AppendHeader("Accept-Ranges", "bytes");
#if false //ダウンロードの強制をしない(ダウンロードダイアログを表示させる。)
context.Response.AppendHeader("Content-Disposition", "filename=\"" + fileName + "\"");
#else
context.Response.AppendHeader("Content-Disposition", "filename=\"" + fileName + "\" attachment;");
#endif
context.Response.AppendHeader("Content-length", fileSize.ToString()); //ファイルサイズにて進行状況把握に。
context.Response.TransmitFile(filePath); //ASP.NET的にはメモリにあまり載せないでそのまま送信
コンテンツタイプいろいろ
| コンテンツタイプ | 説明 |
| application/octet-stream | すべてのストリーム |
| text/plain | 通常テキスト |
| text/csv | csvファイル |
| text/html | html |