CGI_Lite.pmの使い方

[上に] [前に] [次に]
クロレラ [HomePage] 2000/03/26(日) 15:29:12
現在、CGI_Lite.pmを使って、
ブラウザからサーバにファイルをアップロードするスクリプトにチャレンジしているのですが、
アップロード処理をしないで、リロードさせる方法がよく分かりません。

$cgi->set_directory($temp);
$cgi->set_platform($Platform);
$cgi->set_buffer_size ($BUFSZ);
$cgi->add_timestamp(0);
$filename = $cgi->filter_filename(\&ConvName);
$cgi->close_all_files;

でアップロードすることはできますが、その前に

%in = $cgi->parse_form_data;
while (($key, $value) = each %in) {
if ($key eq 'action') { $Action = $value;}
}

として

if ($Action eq 'regist') { &Upload; }
else { &data_view; }

のように分岐させると、うまくいきません。

モジュールの使い方が根本的に理解できていないためだとは思うのですが、
もし何かお気づきの点がありましたら、教えて下さい。

あきを [E-Mail] 2000/03/27(月) 15:30:21
CGI_Lite.pm を使ったことがないので、外しているかも知れませんが、
ファイルのアップロードは、基本的に、 POST をするのと仕組みは一緒です。
リロードするが POST はしない、というのが出来ないのと一緒で、
リロードするがファイルのアップロードはしない、というのは出来ないと思うのですが。

クロレラ 2000/03/27(月) 18:51:15
あきをさん、ありがとうございます。

>リロードするがファイルのアップロードはしない、というのは出来ないと思うのですが。
やはりそうなんですか.....。
アップロード処理を通しても、

sub ConvName {

local($name) = shift;
if ($name eq '') { return; }

}

としてファイル名を空にすると、アップロードしなくなります。
無駄な処理をしているようで、なんとなく釈然としませんが、
これで良しとすべきなのかも知れませんね。

CGI.pmを使ったほうがいいのでしょうか...

あきを [E-Mail] 2000/03/27(月) 19:42:28
と、いいますか、リロードされたかどうかの区別がつかないのです。

<input type=hidden name="action" value="regist">
で、submit を押すと、その後どんなページが表示されようとも、
リロードすれば、 フォームデータが再送信されるので、
action=submit が送信されてしまいます。
( submit を押されるのと、 リロードするのは違うので )

余談。
%in = $cgi->parse_form_data;
if ($in{'action'} eq 'regist') { &Upload; }
で、 OK だと思います。

あきを [E-Mail] 2000/03/27(月) 19:53:48
そうだ。アップロードが完了するまで HTTP ヘッダを吐かずに、
完了したら、 Redirect で別のページに飛ばしちゃえばいいかも。

クロレラ [HomePage] 2000/03/27(月) 22:10:10
たびたびすみません。

>と、いいますか、リロードされたかどうかの区別がつかないのです。
ためしに、フォーム部分やデータ表示部分を取り除き、
http://www.geocities.co.jp/HeartLand-Himawari/2687/upload2.txt
として直接起動すると、エラーは出ず、アップロードが成功したというメッセージが出ます。
ということは、アップロードするファイルがあるかどうかで、リロードかどうかを判断するということになるわけですね。

><input type=hidden name="action" value="regist">
>で、submit を押すと、その後どんなページが表示されようとも、
>リロードすれば、 フォームデータが再送信されるので、
>action=submit が送信されてしまいます。
この説明が、ちょっと理解できていないんですが、
submit後にリロードしても、引数がないのでaction=submitは送信されないと思うのですが、どういうことでしょうか?

>%in = $cgi->parse_form_data;
>if ($in{'action'} eq 'regist') { &Upload; }
>で、 OK だと思います。
ただ、これだと、テキスト入力データのタグなどを一括排除できないので、
while (($key, $value) = each %in) {
$value =~ s/&/&amp;/g;
}
などを噛ませる必要があるんです。
それとも、単に
elsif ($key eq 'action') { $Action = $value;}
で$Actionという別の変数を作る必要はないということかな....?

>そうだ。アップロードが完了するまで HTTP ヘッダを吐かずに、
>完了したら、 Redirect で別のページに飛ばしちゃえばいいかも。
「アップロード処理をしないで、リロードさせる方法がよく分かりません。」
という最初の質問の表現がいけなかったようです。
フォームからの送信内容がテキストデータのみで、アップロードするファイルがないとき、アップロード処理を通らないようにしたいといういうことなんです。
一つ前で、「sub ConvNameを通すと」というような説明をしたのは、
そうしないと、サイズ0のファイルが/tmp/内に出来てしまうからです。
説明不足ですみません。

mizzy 2000/03/27(月) 22:16:56
>フォームからの送信内容がテキストデータのみで、アップロードするファイルがないとき、アップロード処理を通らな
>いようにしたいといういうことなんです。

ということであれば、

if ($FILE) { &Upload; &Regist; &ReadFile; &PageView; } # ----No.1
else { &PageView; }

でいいのではないでしょうか。

あきを [E-Mail] 2000/03/27(月) 23:40:35
私も勘違いしていたようなので、とりあえず訂正。
私の言っていたリロードの意味は、ブラウザの再読み込みボタンを
押した時の話です。そういう話ではなければ、撤回です。

クロレラ 2000/03/27(月) 23:51:19
mizzyさん、ありがとうございます。

if ($File) { &Upload; &Regist; &ReadFile; &PageView; } # ----No.1
elsif (!$File && ($Action eq 'regist')) { &Regist; &ReadFile; &PageView; } # ----No.1

とすると、確かに&Upload;を通さずにすみますね。
ただ、アップロードするファイルがないときも

$cgi->set_directory($temp) or Error("ディレクトリ $temp がオープンできません。");

という処理をデコード部分で毎回行なうのが、
どうも無駄なような気がするんです。
Upload部分に移す、つまり
$filename = $cgi->filter_filename(\&ConvName);
$cgi->close_all_files;
と一緒にしたほうがいいような気がするのですが、
そうすると、アップロードされません。
なんとなく無理なのかも...と思い始めています。

あきを>
>そういう話ではなければ、撤回です。
いえいえ、「リロードされたかどうかの区別」で前進しました。
ありがとうございます。

今日、「Perlモジュール徹底活用法(?)」という本を
立ち読みしましたが、さっぱり分かりませんでした(T_T)
モジュールに挑戦するのは早かったのか...

mizzy 2000/03/28(火) 00:45:52
>$cgi->set_directory($temp) or Error("ディレクトリ $temp がオープンできません。");

>という処理をデコード部分で毎回行なうのが、
>どうも無駄なような気がするんです。
>Upload部分に移す、つまり
>$filename = $cgi->filter_filename(\&ConvName);
>$cgi->close_all_files;
>と一緒にしたほうがいいような気がするのですが、
>そうすると、アップロードされません。

どうやら、$cgi->set_directory($temp)はparse_form_dataの
前に呼び出さないと、勝手に/tmpに設定されてしまうようです。
ですから、Upload部分に移すと、アップロードされてないように
見えるのですが、実は/tmpの下にアップロードされてしまって
いるようです。

こういう仕様なので、ちょっと無理っぽいですね…

クロレラ 2000/03/28(火) 07:10:29
[[解決]]
mizzyさん、もしかして、実際に設置して試されたんですか?
ありがとうございます。
自分だけダメなのかと思っていましたが、
難しいようだと分かって、むしろ安心しました。

我流ながら一応それなりに動いてしまっている
(それにcgi-lib.pl使用より簡潔に書ける)ので悔しいのですが、
MIMEタイプでの選別や、ファイルサイズ制限など、
掲示板らしくするためにはまだ機能不足なので、
やはりCGI.pmを使おうかと考えています。(重いという噂ですが...)

CGI_Liteについての解説やスクリプトは少ないので、
今回はいろいろ勉強になりました。
ありがとうございました。

[上に] [前に] [次に]