@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

XP SP2で拡張子なしのファイルダウンロード時に文字化け

1
投稿者投稿内容
peu
会議室デビュー日: 2005/02/24
投稿数: 5
投稿日時: 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です。
この現象の回避策をご存知の方がいましたら、ご教授よろしくお願いします。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-02-24 19:03
引用:

peuさんの書き込み (2005-02-24 18:08) より:
hc.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" & Server.UrlPathEncode(Mid(strFilePath, strFilePath.LastIndexOf("\\") + 2)))


参考にしたURLのスレッドではUrlEncodeを使っているようですが…
peu
会議室デビュー日: 2005/02/24
投稿数: 5
投稿日時: 2005-02-25 09:50
引用:

ぼのぼのさんの書き込み (2005-02-24 19:03) より:
参考にしたURLのスレッドではUrlEncodeを使っているようですが…


はい、確かにそうです。この部分は試行錯誤しているときに書き換えたのです。
ただ、その部分を下記2つのようにして試してみても、URLエンコードのまま表示されます。

HttpUtility.UrlEncode(Common.GetOnlyFileName(strFilePath))
HttpUtility.UrlEncode(Common.GetOnlyFileName(strFilePath), System.Text.Encoding.GetEncoding("UTF-8"))

UrlEncode、UrlPathEncodeともに、何らかの拡張子(.aaとかでも構わない)が
ついている場合は大丈夫しないのですが、拡張子がないファイルだと
全角文字と半角カナが「%e3%81%82.....」のように表示されます。

拡張子がないファイル名は正常に処理されないのでしょうか・・・。
peu
会議室デビュー日: 2005/02/24
投稿数: 5
投稿日時: 2005-02-25 09:56
ちなみに、web.configのglobalization は
<globalization requestEncoding="shift-jis" responseEncoding="shift-jis" />
です。

上のコードのCommon.GetOnlyFileNameの処理内容は、
Mid(strFilePath, strFilePath.LastIndexOf("\\") + 2)で、処理はまったく同じです。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 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クラス
peu
会議室デビュー日: 2005/02/24
投稿数: 5
投稿日時: 2005-02-25 14:19
引用:

ぼのぼのさんの書き込み (2005-02-25 13:53) より:
 私の環境(Win2K+IE6.0SP1)では、HttpUtility.UrlEncodeメソッド(第一引数のみ指定)で拡張子無しでも文字化けせずに表示できました。この辺りが原因でしょうか?

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5994&forum=7



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のままの場合にはどのように
エンコードすればよいのでしょうか・・・。

引用:

P.S.
ファイル名のパスからの切り出しは自作する必要ないです。#System.IO.Pathクラス


System.IO.Path.GetFileNameというメソッドがあったのですね!
ありがとうございます。知識不足を痛感し、恥ずかしい限りです。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 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にワークテーブル作ってそこを経由する、という方法も考えたのですが、最終的に「ファイル名に全角文字や半角カナは使わない」ということになったので、この方法は採用しませんでした。
peu
会議室デビュー日: 2005/02/24
投稿数: 5
投稿日時: 2005-02-25 16:22
ぼのぼのさん、何度も回答ありがとうございました。

MSのサポートページをご提示だったので、はたと気づいてサポートページで
検索をかけてみましたが、それらしい内容のものは見つかりませんでした。

そもそも、拡張子のないファイルというのが、わりとイレギュラーなことは
承知の上なんですが。
ダウンロードさせるファイル名が、完全にユーザー任せになる仕様で、
しかもそのファイル名に制限をかける仕様は了承されないという背景がありまして。

全角文字や半角カナ、拡張子なしが無ければよかったのですが、現状既にあり得る
ということで、実物も確認済みなので、如何ともしがたいのです。

XP SP2で、ダウンロードファイルに全角文字または半角カナが含まれ、
かつ拡張子なしの場合は文字化けする、というシステム制限で逃げるしかなさそうですね・・・。

ダウンロードを行うリンクボタンに表示しているファイル名は正しく表示されるので、
それをもとに保存時にユーザーが正しく入力することはできるので。
1

スキルアップ/キャリアアップ(JOB@IT)