重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

require "./cgi-lib.pl";

print << "END";
<FORM method="POST" action="$self">
<TABLE border="0" cellspacing="6" width="600">
<TR>
<TD valign="top" width="116">■メッセージ(※)</TD>
<TD colspan="3" width="371"><TEXTAREA rows="10" cols="50" wrap="soft" name="message">$message</TEXTAREA></TD></TR>
<TR>
<TD valign="top" align="right" colspan="2"><INPUT TYPE="file" NAME = "file" size ="50"></TD>
</TR>
</TABLE>
<INPUT TYPE=HIDDEN NAME=mycmd VALUE=do_write>
<INPUT TYPE=HIDDEN NAME=time VALUE="$time">
<INPUT type="submit" value=" 送 る ">
<INPUT type="reset" value="やり直す">
</FORM>・



sub do_write {
&ReadParse;
$message= $in{'message'};

これでmessageの値が取れるはずなのですが、空のようです。同じプログラムで使えてたときもあったのですが、いじっているうちにReadParseが機能しなくなりました。といっても、cgi-libの中をいじったわけではありません。

確実にmessageフォームの中身を取る方法があったら
教えてください。
あるいは原因を探る方法でも結構です。

よろしくお願いします。

A 回答 (7件)

初心者でも解りやすそうなページとして、以下はどうでしょうか。



CGI::Lite
http://digit.que.ne.jp/work/index.cgi?Perl%E3%83 …
http://yaino.com/gzudoc2/0001/000004.html
http://www.lanceweb.jp/perl/p05.html

ReadParse
http://www.aimix.jp/cgi/acccgilibupfile.html

自分で分解するサンプル
http://www.tohoho-web.com/how2/tec1.htm#upload
    • good
    • 0

> ReadParseを消して、&getparamを生かす


> if( $method eq 'POST' ) …を生かしたいのですが、それはむずかしいでしょうか?

getparamの中身を見ていないので何とも言えませんが、実際のところmultipart/form-dataのデータ(MIMEマルチパートデータなどと呼びます)はそれほど複雑ではないので、比較的簡単に分解できます。
(「MIMEマルチパート」や「MIME メッセージ 解析」などで検索すれば情報が見つかるかと思います)

しかし、この処理は定型処理のひとつで数々のライブラリやモジュールがすでに存在しているので、それを使ったほうが楽なのは確かです(どちらを選ぶかは、事情がわからないので私には判断できませんが)。

他のものを使うとなると、いろいろありますが、MIME系のモジュールや、CGI::Liteは軽くて簡単に使えます。受け取ったファイルの扱いなども結構便利にできています。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

CGI::Liteを使うのですか。webで調べたのですが、使い方がわからず固まっています。

やはりgetparamを捨てて、ReadParseで値の取得もやれば、ReadParseのみでmultipart/form-dataとPOSTの受け取り時のデコードを試みた方がよいかも知れませんね?

デコードするときにどんな記述を加えればよいでしょうか?
お手数ですが、教えて頂ければ幸いですm(__)m
何度もすみません。

お礼日時:2006/09/20 02:33

一応補足…



“取得された後の「空」の状態”というのは標準入力、すなわちpostデータです。当該フォームはpostが指定されています。
    • good
    • 0

なるほど解りました。


「if( $method eq 'GET' ) …」の一連のコードは、先ほどの「if ( $mycmd eq 'edit') …」よりも前にあるということですよね。

以下整理して書きます。

■messageが取得できない理由
「if( $method eq 'GET' ) …」の一連のコードがReadParseよりも先にフォームデータを取得してしまうからです。
つまり、もう取得された後の「空」の状態がReadParseに渡されてしまうということです。
言い換えると、「if( $method eq 'GET' ) …」の一連のコードはReadParseと同じ処理をしているわけです(同じことを2回繰り返している。そして2回目は意味がない)。

■> ReadParseでなくてもよいのかな?
上記のようにReadParseと同じことを先にしているのが「if( $method eq 'GET' ) …」の一連のコードですし、またcgi-lib.pl以外のモジュールなどでも良いです。
※しかし…

■<INPUT TYPE="file"~ に注目
これはファイル送信用のフォームタグですが、このようなフォームデータを受け取る場合は通常の方法とは少し異なります。
そしてFORMタグに「enctype="multipart/form-data"」を付けなければなりません。
問題は「if( $method eq 'GET' ) …」の一連のコードが「enctype="multipart/form-data"」の受け取りに対応しているかどうかです(&getparamの部分を確認してください)。

■「enctype="multipart/form-data"」を付けるとdo_writeルーチンが呼ばれない理由
おそらく「if( $method eq 'GET' ) …」の一連のコードが「enctype="multipart/form-data"」の受け取りに対応“していない”のだと思います($mycmd が得られない)。
しかし、前述のように「enctype="multipart/form-data"」を付けないとファイルを受け取れなくなります。

★解決策
まず(無意味に)2つあるフォームデータ取得処理を1つにします。「if( $method eq 'GET' ) …」の一連のコードを生かしてもいいですが、その場合は&getparamを確認して必要なら「enctype="multipart/form-data"」に対応させる必要があります。

現在対応していないなら、ReadParseを生かしたほうが楽でしょう。

ロジックの全体像が解らないので何ともいえませんが、通常、無条件にフォームデータをまず先に受け取って良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

ようやくわかりました。値を2度、取ってましたね。
値が取れないのは当たり前でした。

ただ、次の問題に当たりました。

>「enctype="multipart/form-data"」に対応させる必要があります。

なのです。

>ReadParseを生かしたほうが楽でしょう

ということなのですが、この方法がわかりません。

ReadParseを消して、&getparamを生かす
if( $method eq 'POST' ) …を生かしたいのですが、それはむずかしいでしょうか?

問題は下のURLと同じ問題に当たっているようなのはわかっているのですが、「enctype="multipart/form-data"」はむずかしいですね。
http://www.tohoho-web.com/lng/200003/00030065.htm

お礼日時:2006/09/20 00:25

以下のコードだと、フォームデータを取得する前では$mycmdも取得できていないのでは?



if ( $mycmd eq 'edit') {
&edit;
}elsif( $mycmd eq 'do_write' ) {
&do_write;

ちなみに、どこかに「$mycmd = $in{'mycmd'};」があるわけですよね?これはパース後でなければ意味がありません。

さらに、「enctype="multipart/form-data"」を付けるとdo_writeルーチンが呼ばれない、とのことですが、むしろ逆に「付けなければ呼ばれる」ということが問題だと思います。
(本来なら付けても付けなくても呼ばれないはず。)
推測ですが、「enctype="multipart/form-data"」を付けた場合に正常にパースされて、それと上記コードの位置関係から、付けない場合は$mycmdが空のまま、上記if文あたりに何らかの不具合があるような気がします。

しかし省略部分がありすぎて、ロジックがよく解りません。
もう少しコードを載せていただければ解ると思うのですが。
    • good
    • 0
この回答へのお礼

再回答ありがとうございました。



if( $method eq 'GET' ) {
$query = $ENV{ 'QUERY_STRING' };# データの受け取り
&getparam( $query );# データの分解
$mode = 'show_write';# 処理モードの決定(show_write:表示)
}elsif( $method eq 'POST' ) {
read( STDIN, $query, $ENV{ 'CONTENT_LENGTH' } );# データの受け取り
&getparam( $query );# データの分解

$mycmd = $param{ 'mycmd' };

これで$mycmdは取得しています。

自分でいま混乱しているのですが、
ReadParseでなくてもよいのかな?

お礼日時:2006/09/19 21:08

require "./cgi-lib.pl";


の下に
&do_write;

と書いていますか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

if ( $mycmd eq 'edit') {
&edit;
}elsif( $mycmd eq 'do_write' ) {
&do_write;

と書いております。

お礼日時:2006/09/19 19:59

<form method="post" action="$self" enctype="multipart/form-data">



にしてみては?
    • good
    • 0
この回答へのお礼

ありがとうございます。

実は、enctype="multipart/form-data">
やってたんですが、そうするとどういうわけか
do_writeルーチンを通らなくなるのです???

いまためしにやってみましたがdo_writeを
通らない状態になってしまいました。

どうしてでしょう?

お礼日時:2006/09/19 20:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!