- PR -

IEにてファイルのダウンロードを行った際の全角文字自動補正について

1
投稿者投稿内容
vb
会議室デビュー日: 2005/03/03
投稿数: 1
投稿日時: 2005-03-03 17:58
初めて書き込みさせていただきます。
vbと申します。

現在、VB.NETにて、WEBアプリケーションの開発を行っている者ですが
1点難題を抱えており、皆様のお知恵をお借りできたらと思い書き込み致しました。

問題の概要としましては
IEにてファイルのダウンロードを行った際に、長い日本語のファイル名が
自動補正されてしまう症状があり、これを、回避したいと言うものです。

詳細としては
全角16文字を超過するファイル名
12345678901234567.lzh
をダウンロードすると、「ファイルのダウンロード」画面に表示される
ファイル名が2345678901234567.lzh
と言うように、意図的に前が短縮(1が消える)された形式となってしまいます。
また、保存時にファイル名の欄に表示されるファイル名も同様です。

1234567890123456789.lzh
では
4567890123456789.lzh
となります。

また、全角25文字を超えた場合に、ファイル名が別の物に挿し変わってしまいます。
12345678901234567890123456.lzh
のファイルでは、
CAGL2BGX.lzh
と言うテンポラリファイル名のような形式に変わります。

環境としては
Visual Basic .NET 69516-335-0000007-18951
ブラウザはIE 6.0.2800.1106。xpsp2.040919-1003
となります。

ファイルの送信処理の切り出しとしては以下のコードになります。
Dim fname As String = System.Web.HttpUtility.UrlEncode(ファイル名)
Response.ContentType = "application/octet-stream"
Response.AddHeader("content-disposition", "attachment; filename=" + fname)
Response.WriteFile(ローカルファイルパス)
Response.End()

Web.configは以下のように定義しております。
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

補足として
半角文字のファイル名の場合は、同様のバイト数にしても問題ありませんでした。


そもそも、日本語の長いファイル名を使用するのが悪いのでしょうが
顧客からの強い要望があり、大変悩んでおります。

どなたか、前に同様の症状が発生し、無事解決された方がいましたら
ヒントだけでも構いませんので、お教え頂けると、助かります。

どうか宜しくお願い致します。
未記入
会議室デビュー日: 2005/03/04
投稿数: 1
投稿日時: 2005-03-04 16:35
IEの仕業っぽいです。
インターネットオプションの詳細設定タブの「常に UTF-8として URL を送信する」の
チェックを外してみてください。
聖人@SKB
ベテラン
会議室デビュー日: 2003/03/26
投稿数: 58
お住まい・勤務地: 横浜(MM21)勤務の筈だがいつも顧客先常駐
投稿日時: 2005-03-08 17:13
日本語の長いファイル名、同様の問題に直面しました。
「ASP.NETの仕様ですから、運用で対応して下さい」
と言っても、ユーザが利用するファイル名の大半が日本語かつ長いファイル名
だったら何かしらの策を考えないといけないと思います。

今回の件、http://support.microsoft.com/default.aspx?scid=kb;ja;436616
ここにあるように、UrlEncodeを行ったところで完全に変換できるわけでは
ありません。Web.configのresponseEncodingでも解決しません。

以下、私の対応策を書きます。
簡単に言うと、
「ダウンロード用のASPページを介してファイルをダウンロードさせる」です。

ダウンロード用ASP:(.asp)
・Requestのパラメータとしてファイル名を取得
・取得したファイル名を使ってファイルを読み込む
・ファイルをResponseとして出力する

呼び元のページ:(.aspx)
・ダウンロード用のリンク文字を上記ASPにする
・Requestのパラメータとしてファイル名を設定

※「ファイルをResponseとして出力する」のところで悩むと思います。
BASP21を利用すれば簡単に解決しますが、
そうでない場合、いろいろと調べる必要があります。

他の解決方法をご存知の方、書込み願います。

[ メッセージ編集済み 編集者: 聖人@SKB 編集日時 2005-03-08 17:15 ]
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-03-08 17:39
引用:

BASP21を利用すれば簡単に解決しますが、
そうでない場合、いろいろと調べる必要があります。



ADODB.Streamを使えば簡単でしょう。
http://support.microsoft.com/default.aspx?scid=kb;ja;276488

引用:

他の解決方法をご存知の方、書込み願います。



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

質問者はVB.netでCGIプログラムを作成することにより解決したそうです。

[ メッセージ編集済み 編集者: todo 編集日時 2005-03-08 17:40 ]
聖人@SKB
ベテラン
会議室デビュー日: 2003/03/26
投稿数: 58
お住まい・勤務地: 横浜(MM21)勤務の筈だがいつも顧客先常駐
投稿日時: 2005-03-08 18:02
あら、「ADODB.Stream」でましたか。
私はこれに辿りつくまでに結構時間がかかりました。
因みにbasp21を使った例は下記URLを参照するとよいと思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17526&forum=7


[ メッセージ編集済み 編集者: 聖人@SKB 編集日時 2005-03-08 18:18 ]
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-03-10 14:07
ども、ぼのぼのです。
自分の投稿にリンク貼られるとちょっと照れますね

引用:

あら、「ADODB.Stream」でましたか。
私はこれに辿りつくまでに結構時間がかかりました。



同じく。で、途中で他の方法としてこんなのも見つけました。

BASP21は、大量の便利な関数が入ってますが、今回使いたいのはバイナリリーダだけ。それくらいなら自分で作れるな、と。はじめはVBかVC++で作ろうと思ってたんですが、VB.NETで作れたら楽だなーと思って調べてたら見つけました。
1

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