• ベストアンサー

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

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

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

  • ベストアンサー
  • 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