- - PR -
XP SP2で拡張子なしのファイルダウンロード時に文字化け
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-02-24 18:08
初めて書き込みします。
ファイルのダウンロードページを下記のように実装したのですが、 ダウンロードするファイルに拡張子がない場合、 Windows XP SP2のIE6にて、ダイアログのファイル名が 正常に表示されません。(URLエンコードされたままです) 「保存」のボタンを押して表示されるファイル名もまた、同じ現象です。 Private Sub LinkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) '-- ダウンロード用のContextを生成する Dim hc As HttpContext Dim strFilePath As String = "c:\\temp\\拡張子なし" '//設定 If InStr(Request("HTTP_USER_AGENT"), " MSIE 5.5;") > 0 Then ' //IE5.5用 hc.Current.Response.ContentType = "application/octet-stream-dummy" Else ' //それ以外 hc.Current.Response.ContentType = "application/octet-stream" End If hc.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" & Server.UrlPathEncode(Mid(strFilePath, strFilePath.LastIndexOf("\\") + 2))) hc.Current.Response.WriteFile(strFilePath) '-- 出力 '-- 出力終了 hc.Current.Response.Flush() hc.Current.Response.End() End Sub 下記のスレッドを参考にして実装しました。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1299&forum=7 開発環境はASP.NET、VB.NET、.NET Framework1.1です。 この現象の回避策をご存知の方がいましたら、ご教授よろしくお願いします。 | ||||||||
|
投稿日時: 2005-02-24 19:03
参考にしたURLのスレッドではUrlEncodeを使っているようですが… | ||||||||
|
投稿日時: 2005-02-25 09:50
はい、確かにそうです。この部分は試行錯誤しているときに書き換えたのです。 ただ、その部分を下記2つのようにして試してみても、URLエンコードのまま表示されます。 HttpUtility.UrlEncode(Common.GetOnlyFileName(strFilePath)) HttpUtility.UrlEncode(Common.GetOnlyFileName(strFilePath), System.Text.Encoding.GetEncoding("UTF-8")) UrlEncode、UrlPathEncodeともに、何らかの拡張子(.aaとかでも構わない)が ついている場合は大丈夫しないのですが、拡張子がないファイルだと 全角文字と半角カナが「%e3%81%82.....」のように表示されます。 拡張子がないファイル名は正常に処理されないのでしょうか・・・。 | ||||||||
|
投稿日時: 2005-02-25 09:56
ちなみに、web.configのglobalization は
<globalization requestEncoding="shift-jis" responseEncoding="shift-jis" /> です。 上のコードのCommon.GetOnlyFileNameの処理内容は、 Mid(strFilePath, strFilePath.LastIndexOf("\\") + 2)で、処理はまったく同じです。 | ||||||||
|
投稿日時: 2005-02-25 13:53
私の環境(Win2K+IE6.0SP1)では、HttpUtility.UrlEncodeメソッド(第一引数のみ指定)で拡張子無しでも文字化けせずに表示できました。この辺りが原因でしょうか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5994&forum=7 P.S. ファイル名のパスからの切り出しは自作する必要ないです。#System.IO.Pathクラス | ||||||||
|
投稿日時: 2005-02-25 14:19
XP SP2以外は、正常に表示されます。ご提示のスレッドも拝見しまして、前述したようにUrlEncodeの引数に明示的にUTF-8を付けてみましたが、やはりだめでした。 念のためglobalization もREQUEST,RESPONSEともにUTF-8にして、以下の3つを試しましたが、全てだめでした。 Server.UrlPathEncode(Common.GetOnlyFileName(strFilePath)) HttpUtility.UrlEncode(Common.GetOnlyFileName(strFilePath)) HttpUtility.UrlEncode(Common.GetOnlyFileName(strFilePath), System.Text.Encoding.GetEncoding("UTF-8")) globalizationの変更はテスト的にしただけなので、shift-jisのままの場合にはどのように エンコードすればよいのでしょうか・・・。
System.IO.Path.GetFileNameというメソッドがあったのですね! ありがとうございます。知識不足を痛感し、恥ずかしい限りです。 | ||||||||
|
投稿日時: 2005-02-25 15:13
うーん、残念ながら私にわかるのはここまでです細かいことは覚えてないのですが、私も以前XP SP2以外で似たような問題にぶち当たりまして、Microsoftのサイトでこんなのを見つけました。 http://support.microsoft.com/default.aspx?scid=kb;ja;436616 で、結局その時は「ASP.NETじゃ無理」って結論に達しまして、代替案としてダウンロードモジュールだけASPで実装する、という方法を考えました。 ただ、ASP.NETとASPはSessionを共有できないので、requestパラメータでファイル名を渡すんですけど、その実装がばれるとURL直指定で悪意あるユーザがサーバ上の任意のファイルをダウンロードできてしまう、という問題がありまして DBにワークテーブル作ってそこを経由する、という方法も考えたのですが、最終的に「ファイル名に全角文字や半角カナは使わない」ということになったので、この方法は採用しませんでした。 | ||||||||
|
投稿日時: 2005-02-25 16:22
ぼのぼのさん、何度も回答ありがとうございました。
MSのサポートページをご提示だったので、はたと気づいてサポートページで 検索をかけてみましたが、それらしい内容のものは見つかりませんでした。 そもそも、拡張子のないファイルというのが、わりとイレギュラーなことは 承知の上なんですが。 ダウンロードさせるファイル名が、完全にユーザー任せになる仕様で、 しかもそのファイル名に制限をかける仕様は了承されないという背景がありまして。 全角文字や半角カナ、拡張子なしが無ければよかったのですが、現状既にあり得る ということで、実物も確認済みなので、如何ともしがたいのです。 XP SP2で、ダウンロードファイルに全角文字または半角カナが含まれ、 かつ拡張子なしの場合は文字化けする、というシステム制限で逃げるしかなさそうですね・・・。 ダウンロードを行うリンクボタンに表示しているファイル名は正しく表示されるので、 それをもとに保存時にユーザーが正しく入力することはできるので。 | ||||||||
1
