- - PR -
ファイルダウンロード時のファイル名文字化け
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-08-10 18:31
nakamuraと申します。
あるwebページ上のリンクからファイルをクライアント側にてダウンロードするプログラムを作成しました。リンクからcgi(Perl)を起動してそのcgiからファイルダウンロードを実行します。cgiを起動する際、日本語ファイル名(euc)を渡して、それをcgiよりsjisにコンバートしてからダウンロードを実行させています。ある特定の文字だけ文字化けする現象が発覚しました。ある特定の文字とは、ラリルレロワヲン です。このどれかが一つでも入っているとファイル名が文字化けしてしまいます。他にもあるかもしれませんが、自分が見つけたのはこの文字です。 ちなみに、リンクを右クリックで、対象をファイルに保存だと、ファイル名は文字化けしません。 色々ネットで調べたのですが、対応方法がとんとわかりませんでした。ASP、java等の対応方法はいくらでもあるのですが、cgi(Perl)の対応方法が見つかりません。 どなたかご存知の方いらっしゃいますでしょうか。 ちなみに サーバ側 OS:Red Hat Enterprise Linux ES release 4 (Nahant Update 4) cgi:不明 クライアント側IE:6.0SP2 念のため下記にコードを記します。 #!/usr/local/bin/perl require '../cgi-lib.pl'; require '../jcode.pl'; # 入力データを連想配列に読み込む &ReadParse(*in); # パラメータを変数に代入する。 #日本語ファイル名 $OriginalFileName = $in{'OriginalFileName'}; #ファイル保管ディレクトリの絶対パス $FileStoragePath = '/html/file/'; # 日本語文字列の編集(ダウンロードファイル名をShift-JISへ変換) &jcode'convert(*OriginalFileName, 'sjis'); # ファイル出力処理実行 &outputFile(); exit(0); sub outputFile { $FHND = "<$FileStoragePath/$FileName"; if (open FHND) { print ("Content-type: Application/octet-stream\n"); # print ("Content-Disposition: attachment; filename=\"download_$FileName\"\n\n"); print ("Content-Disposition: inline; filename=\"$OriginalFileName\"\n\n"); while (<FHND>) { print $_; } close FHND; } else { &outputErrHtml("ファイル読み込みに失敗しました。"); exit(0); } } sub outputErrHtml { 〜エラー表示のためのhtml表示〜 } | ||||||||
|
投稿日時: 2007-08-10 18:46
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36881&forum=12
http://www.wsdeveloper.com/viewtopic.php?p=149 [追記] 趣旨がPerlでのサンプルが欲しい、なんですね。 メールの件名に日本語を使う場合のコードを流用出来ると思います。 [/追記] 投稿先の会議室間違えてませんか? ここはInsider.NETですよ? [ メッセージ編集済み 編集者: あしゅ 編集日時 2007-08-10 18:54 ] | ||||||||
|
投稿日時: 2007-08-16 11:34
あしゅさん、レスが遅れて申し訳ありません。Perlの質問はどこに投稿すればよかったのか分からず、投稿先も間違えてしまいました。
早速ですが、あしゅさんに教えていただいたページを見てこれをPerlに直すのが至難の業で。。下記のところがどうしてもわかりません。(Perl初心者です。) byte[] array = str.getBytes(encoding); StringBuffer buf = new StringBuffer(); for (int i = 0; i < array.length; i++) { buf.append(byteToStr[byteToInt(array[i])]); } return buf.toString(); 上記でまず、引数で渡された文字列をUTF-8に変換している箇所のPerlのコードがわかりません。そしてそれを変数byteの配列にセットするところも調べたのですがとんとわかりませんでした。それとbufの宣言、そのbufに追加でセットしているのは、単にファイルbufに文字列を追加しているということでしょうか? 本当に初心者で申し訳ありませんが、ご教授願いますでしょうか。もしくはヒントを与えてやってくれないでしょうか。 | ||||||||
|
投稿日時: 2007-08-16 13:47
PerlならEncode.pmを使うのでは? http://search.cpan.org/dist/Encode/Encode.pm #jcode.plはutf-8非対応だったかと思います。 | ||||||||
|
投稿日時: 2007-08-16 14:13
| ||||||||
|
投稿日時: 2007-08-16 14:20
| ||||||||
|
投稿日時: 2007-08-16 16:12
#日本語のファイル名を使わないのが一番なのは間違いないですけどね・・
UTF-8に変換したければそれが常道です(と書いたつもりだった)。
あしゅさんが書かれたURLはご覧になってるんですよね?他の言語で書かれたものと同じようにレスポンスを返せば当然同じ動作になります。クライアントはサーバ側の言語が何であるかは無関係ですから。 | ||||||||
|
投稿日時: 2007-08-16 16:27
|