• ベストアンサー

CGI_lite.pmを使ったファイルのアップロード

CGI_lite.pmを使いファイルをアップロードしたところちゃんとファイル自体はアップロードできているのですがファイル名が変わってしまっています。 たとえば「index.html」というファイル名ならば「980815043__index.html」と なってしまいます。 サーバーはunixです。 どうか詳しい方教えてください。お願いします。

  • CGI
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • jiri_t
  • ベストアンサー率25% (1/4)
回答No.4

1普通にテキストエリアからテキストを読むようにする (多分これでとれたと思います) 2アップロードされたファイルから取得する (ディレクトリの中を検索。先代はこれでやっていました) 最悪2でできるのでやってみてください (ただしアクセスが多くなって処理し切れなくなると どうなるか、考えただけでぞっとしますが...) 多分一番でできますのでやってみてください っていうかソースプログラムにファイル名変換という気になる フレーズがあるのでそっちの方が確実かも知れませんね 後は正規表現との戦いです(笑)

Sadsfan
質問者

お礼

ありがとうございました。1でできました。2は使いたくないですね。恐ろしいです。

その他の回答 (3)

  • jiri_t
  • ベストアンサー率25% (1/4)
回答No.3

うーん、わたしの説明不足だったようですね。 確認というのはSadsfanさんがデバッグのためにと言うことだったのですが... Sadsfanさんがunixマシン(telnetでもsshでも何でもいいですが)の 前にいらっしゃると仮定します。 まず送られて来たデータは$Tempの場所に保存されます。 (私の場合は./といった相対パスではなく/home/user/tempなどにしています) ここに (数字の羅列)__(目的のファイル名) と間には_(アンダーバー)を2つ挟むと言う規則で ファイルが保存されます。 よって正規表現でアンダーバーの前の数字をとってしまえば もとのファイル名を取得することができるのです。 *__*(<-正規表現で書いた一般の形、顔になっちゃった) ファイルの移動はアンダーバーを含んだファイル名から 正しいファイル名にと言う感じで cp /home/user/temp/980815043__index.html /home/user/index.html (ごめんなさい 最近perlやってないので普通のcpコマンドでかんべんしてください) '/home/user'や'/home/user/temp'を変数に代入しておけば 文字列の連結でできると思います ファイルの保存先を変えるときはパーミッションに気を付けてください 多分nobodyの書けるところじゃないと書けないはずですから...

Sadsfan
質問者

補足

ご丁寧にありがとうございました。あと肝心なことを聞きたいのですが、アップロードされたファイル名はどう取得したらよいのでしょうか。 何度も質問すいません・・・お願いします!

  • jiri_t
  • ベストアンサー率25% (1/4)
回答No.2

え、ファイル名がだけ変わっているんじゃないの? このperlファイルを見る限り $Tempのディレクトリに送られて来たファイルが入っていて そこからファイル名を変えて必要な場所に移動してあげれば いいと思うんですが... まずアップロードされたファイルがあるかどうか 確認してください 実験する場合はHTMLのようなテキストだけではなく gifなどを混ぜて行うとちゃんと送信できたかどうかわかりますよ

Sadsfan
質問者

補足

すいません補足しときます。確かにFTPとかでファイルの確認をすればいいと思うのですが、最終的にすべてCGIを使用する予定です。 今の時点ではファイル名がサーバーにアップロードされた時点でなにが頭につくかが判断することができません。となるとCGIでファイルのリネーム、移動などもできないのではないでしょうか。 ご指摘ありがとうございました。何か方法がおわかりになりましたらよろしくお願いします。

  • jiri_t
  • ベストアンサー率25% (1/4)
回答No.1

私も昔やったことがある(先代の人の直し)のでわかります。 確かにこれは厄介で困りました。 やり方は ($temp,$filename)=split /__/,$files; $filesはファイルへのパスです(例 /uer/home/user1/980814043__html) 単に名前を変えてやれば良かったと思います $filenameのなかを見てやればアップロードしたいファイル名になっていると思います

Sadsfan
質問者

補足

ごめんなさい。変化なしです。おそらくファイルへのパスの$filesが別物だと思いますが、わからないので(雑誌に乗ってたやつなので)下にコピーしますのでもしおひまがありましたら、見てやってください。 よろしくお願いします。 __________________________________________________________________ use CGI_Lite; require 'util.pl'; # # 定数 # $Temp = './temp'; $Platform = 'Unix'; $BUFSZ = 2048; $CharSet = 'Shift_JIS'; $upload = new CGI_Lite; # アップロード先 $upload->set_directory($Temp) or exitError("ディレクトリ $Temp がオープンできません。"); # プラットフォームの設定 $upload->set_platform($Platform); # バッファーサイズの設定 $upload->set_buffer_size ($BUFSZ); # ファイル名の変換 $filename = $upload->filter_filename(\&convName); $upload->close_all_files; # フォームデータの解析 %data = $upload->parse_form_data; if ($upload->is_error()) { # アップロードのエラー exitError($upload->get_error_message()); } print <<END_OF_HTML; Content-type: text/html 省略 ____________________________________________________________________

関連するQ&A

  • CGI::Liteでファイルのアップロード

    Perl5.8でCGI::Liteを使ってファイルのアップロードをするつもりですが、ファイル名が日本語の場合とファイルの中身が文字化けして保存されています。 文字コードはutf8で統一させているのですが、 例えば、テスト.txtというファイルで中身がEUC-JPのファイルをアップロードしてもアップロード先でファイル名が化けずに中身もEUC-JPで保存されるようにしたいのですが、どういう関数を施せば良いでしょうか? CGI::Liteに変わる他のモジュールでもあるのでしょうか?

    • ベストアンサー
    • Perl
  • [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"; 以上、よろしくお願いします。

    • 締切済み
    • CGI
  • CGI_Lite.pmは,Perl6.5.1 で使えますか?

     私は初心者です。本を見ながら付属CDに入っていた掲示板セットをアップロードしましたが正常に動作しませんでした。いろいろ試行錯誤をした結果、どうやら「CGI_Lite.pm」というものが原因らしく、それはPerlのバージョン4では使えないということまでは知りました。  私のアップロードしているレンタルサーバのバージョンは6.5.1ですが、「CGI_Lite.pm」は機能しないのでしょうか?初心者故に的外れな質問かもしれませんが、どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • CGI_Lite.pmをしようしてデータをアップロード

    CGI Lite v1.8 Last modified: May 10, 1997 下記メッセージがででサーバーにデータをアップロードできいません。 意味がわからないので教えてください。サンプルプログラムは書籍より入手したそのままをしようしているのですが。 Oh, Oh! I'm upset! Can't read what I want また、CSVデータをサーバーにアップロードしたいCGIを作成したいのですが、他になにかわかりやすいサンプル等あれば教えていただけないでしょうか?

    • ベストアンサー
    • Perl
  • cgiでファイルをアップロードし、メールに添付したい。

    ファイルをアップロードし、sendmailで添付ファイルとして送信したいと思い、サイトを回っているのですが、いまいちファイルアップロードについてわかりません。 確認画面を表示させるため、ファイルを一時的にサーバに保持させるため、アップロードのやり方を調べていたのですが・・・さっぱりよくわからなく・・・。 cgi-lib、CGI.pmを使えば、アップロードができると知ったのですが、詳しく書かれているところが見つからずちんぷんかんぷんで困っています。 もし、詳しい事を書いているサイトなどがありましたら、教えていただけないでしょうか? 今のところ、cgi-libを使用してアップロードを考えています。 これってむずかしいのでしょうか???

    • 締切済み
    • CGI
  • ファイルのアップロード Perl5.8

    ファイルのアップロードでCGI::Liteを使っています。 PerlはActivePerlのバージョン5.8ですが アップロード先のデータの中身が変わってしまい、 画像データなのに別のファイルになって表示されなくなりました。 これはファイル自体の文字コード変換が絡んでいるということですか? また、CGIとCGI::Liteの違いですが、両方使ってもよいのでしょうか?

    • ベストアンサー
    • Perl
  • CGIで日本語名ファイルのアップロード

    日本語名のファイルをアップロードするCGIを教えて下さい。 下記ページを参考にさせていただいて、半角のファイル名はアップロードできております。 http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • cgi.pmでファイルアップ炉ロードします。ファイルが存在しないときは・・・

    HTMLで <input type="file"...> として、参照ボタンを押すとファイルアップロードができるようにし cgi.pmを使って、webサーバに画像をアップロード掲示板をいま使っているのですが、参照ボタンを押さずにinput type=fileのテキストボックスにでたらめの単語を入れても、送信が出来てしまいます。ゼロバイトのファイルがサーバにできるわけですが・・・ このようなことを対処するにはどうすればいいのですか? でたらめなファイルメイだったら-1を返すなどといったような使い方をcgi.pmでできますか? もしよろしければ、回答よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGI のモジュールをつかってファイルのアップロード

    use CGI qw(:standard); use File::Basename; $upimg1_pm = param('upimg1'); while (read($upimg1_pm, $buffer, 2048)) { $file .= $buffer; } $FileName = basename($upimg1_pm, ""); open UP,"> $img_dir/$FileName"; binmode UP; print UP $file; close UP; 上のようにファイルのアップロードのプログラムを書いたのですが、実際アップロードしたら C:\Documents and Settings\~top.gif のようにWindowsのローカルパスがそのままファイル名としてアップロードされてしまいました。 basenameはファイル名をとるモジュールときいていたのですがなぜこうなるのでしょうか? おそれいりますがご教授おねがいします。 もしかしてFile::Basename;のモジュールがないとか・・・ Perl5です。

    • ベストアンサー
    • CGI
  • ロリポップでのCGIファイルの使用について

    ホームページ作成ソフトで、携帯用サイトを作りサーバーにアップロードしたのですが、 ブラウザで確認するとエラー403がでてしまいます。 ソフトのユーザーサポートに問い合わせたところ、プログラムには問題がないので、 サーバーとCGIの関係で問題があるのではとの事でした。 エラー表示の注記に <CGIを利用の場合は「index.cgi」 の名前のファイルが無い場合、エラーが発生いたしますのでご注意ください。> とあったので、 試しにcgiのファイル名に「index.cgi」と入れてみたのですが、同じエラーが表示されてしまいました。 この場合、うまくブラウザに反映させるにはどのようにすれば良いのでしょうか。 利用環境・状況は次の通りですので、よろしくお願いいたします。 ■OS windowsXP ■ブラウザ IE ■アップロードしたファイル 「htmlファイル1つ」と「cgiファイル1つ」 ちなみに、htmlファイル単体ではブラウザに表示されるようです。