
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フォームの中身を取る方法があったら
教えてください。
あるいは原因を探る方法でも結構です。
よろしくお願いします。
No.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
No.6
- 回答日時:
> ReadParseを消して、&getparamを生かす
> if( $method eq 'POST' ) …を生かしたいのですが、それはむずかしいでしょうか?
getparamの中身を見ていないので何とも言えませんが、実際のところmultipart/form-dataのデータ(MIMEマルチパートデータなどと呼びます)はそれほど複雑ではないので、比較的簡単に分解できます。
(「MIMEマルチパート」や「MIME メッセージ 解析」などで検索すれば情報が見つかるかと思います)
しかし、この処理は定型処理のひとつで数々のライブラリやモジュールがすでに存在しているので、それを使ったほうが楽なのは確かです(どちらを選ぶかは、事情がわからないので私には判断できませんが)。
他のものを使うとなると、いろいろありますが、MIME系のモジュールや、CGI::Liteは軽くて簡単に使えます。受け取ったファイルの扱いなども結構便利にできています。
回答ありがとうございました。
CGI::Liteを使うのですか。webで調べたのですが、使い方がわからず固まっています。
やはりgetparamを捨てて、ReadParseで値の取得もやれば、ReadParseのみでmultipart/form-dataとPOSTの受け取り時のデコードを試みた方がよいかも知れませんね?
デコードするときにどんな記述を加えればよいでしょうか?
お手数ですが、教えて頂ければ幸いですm(__)m
何度もすみません。
No.4
- 回答日時:
なるほど解りました。
「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を生かしたほうが楽でしょう。
ロジックの全体像が解らないので何ともいえませんが、通常、無条件にフォームデータをまず先に受け取って良いと思います。
回答ありがとうございました。
ようやくわかりました。値を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
No.3
- 回答日時:
以下のコードだと、フォームデータを取得する前では$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文あたりに何らかの不具合があるような気がします。
しかし省略部分がありすぎて、ロジックがよく解りません。
もう少しコードを載せていただければ解ると思うのですが。
再回答ありがとうございました。
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でなくてもよいのかな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
int型(2バイト)データの分割
-
C言語の構造体にてバブルソート...
-
エクセルVBA:日付データの変換...
-
C++/CLIのオブジェクト型配列
-
画像処理のチェーンコード
-
stable diffusionのエラー
-
VisualBasicでレジストリキーの...
-
aliasesファイルを検索したいの...
-
pythonでDBのカラム名で取得し...
-
参照渡しの速度について
-
構造体の初期化の時にポインタ...
-
エクセルVBAで16の16乗を正確に...
-
Perlで取得した情報をFlashへ渡す
-
perlチェックでエラーが出て困...
-
C#でのswitch文
-
音声波形の数値表示用のソフト
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
DataGridViewの特定列に入力さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
stable diffusionのエラー
-
エクセルVBA:日付データの変換...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
C#でのswitch文
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
printfの%eで指数部分の桁数を...
-
ポインター引数の関数でコンパ...
-
CreateProcessでの環境変数の設...
-
C言語でのLinuxとwindows共通の...
-
C言語でPBYTE型からDOUBLE型へ変換
-
pythonでDBのカラム名で取得し...
-
エクセルVBAで16の16乗を正確に...
-
FFTがうまくできない
-
ビットデータのチェック方法
-
参照渡しの速度について
-
POSTで配列のデータを渡す方法は?
-
PINVOKEで構造体配列をマーシャ...
おすすめ情報