- 締切済み
[Perl] CGI_Lite.pmでファイル名取得できない
CGI_Lite.pmを使用してファイルをアップロードするCGIを書いていますが、ファイル名によっては、名前の途中までが消えてしまいます。 cgiとhtmlは、以下のとおりです。EUC、Shif-JISの両方で、また、LinuxとWindowsXPの両方で試してみました。 例 「可能性.txt」というファイルをアップすると、 「性.txt」というファイル名になります。 環境: CGI_Lite.pmは、2つのバージョンを試してみました。 (1), CGI_Lite 2.02 http://search.cpan.org/~smylers/CGI-Lite-2.02/Lite.pm (2), CGI_Lite 1.8 http://search.cpan.org/dist/CGI_Lite/ OSなど (1), WindowsXP + AnHTTPd + Perl5.8.8 (2), SuSE Linux + Apache2.0 + Perl5.8.3 ■アップするHTML <html> <form action='test.cgi' ENCTYPE='multipart/form-data' method='post'> <input type="file" name="file1"> <input type="submit"> </form> </html> ■アップされるCGI(test.cgi) #!/usr/bin/perl use CGI::Lite; my $cgi=new CGI::Lite; $cgi->add_timestamp(0); $cgi->set_directory('./') or die $!; $cgi->set_platform ('Unix'); $cgi->set_buffer_size (10000); my %in = $cgi->parse_form_data(); print"Content-type: text/html\n\n"; print"-->$in{'file1'}\n"; 以上、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
sjisのまま扱いたいということなら、 ShiftJIS 「脳」の文字コード -OKWave http://okwave.jp/qa3306321.html の回答 No.2 にあるようなパターンで、ダメ文字の中に隠れている '\' をエスケープすればうまくいきませんか? デバッグのときなんかはいろいろ見落としがちですからね。 謝るこたないですよ♪
- sakusaker7
- ベストアンサー率62% (800/1280)
EUCでも発生するというのでちとアレですが >echo 可能性|hexdump 00000000: 89 C2 94 5C 90 AB 0A .B.\.+. '能'がいわゆるダメ文字なんで問題起こしてるんじゃないでしょうか。
補足
すみません、大変失礼しました。 EUCも試したつもりだったのですが、もう一度EUCで試してみたところ、ファイル名が問題なく取得できました。 とりあえず、これで回避方法ができたわけですが、できればShift-JISのほうが助かるので、このQ&Aはもう少し開いたままにしておきます。 よく確認せずにすみませんでした。
お礼
度々、ありがとうございます。 CGI_Lite.pmのソースの中で、STDINからの入力部分に、お教えいただいたリンクの回答No.2を 挿入してみました。 結論からいうと、ファイル名の「可能性.txt」は「性.txt」のままです。 ただ、<input type="text">などで送ったPOSTデータは「可能性」が「可能\性」として 変換されるので、もう少しCGI_Lite.pmを解析すればなんとかなりそうな気はしています。 Perlは(も)あまり詳しくなので、時間のあるときにでも頑張ってみようと思います。 ありがとうございました。