• ベストアンサー

cgiでのデータ受信

すみません、これで最後にします・・・ http://okwave.jp/qa/q7445617.html 結局getによるデータ受信の方もできませんでした。 やはりPOSTに戻ってやってみると、$ENV{'CONTENT_LENGTH'}の値は入っています。 文字の長さが入っているということは、文字列が入っているだろうということなので、 後は文字を読み込むだけのはずです。 となると read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); このコードが間違っているのでしょうか?

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

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

  • ベストアンサー
回答No.1

すごい原理的な仕組みを使って、CGIのパラメータを取得しようとしているみたいですけど、CGI.pmくらいは使いましょう。(cgi-lib.plじゃなくて) CGI.pmなどのモジュールを使わずPOSTが動いているのを確認したいだけなら、つぎのコードで確認できます。表示がくずれるので、空白2文字を全角空白にしていることに注意。 --- foo.html <html>  <head>   <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />   <title>TEST</title>  </head>  <body>   <form method="POST" name="hoge" action="foo.cgi">    <div>TEXT DATA: <input type="text" name="NAME"></div>    <input type="submit" value="SEND">   </form>  </body> </html> --- foo.cgi #!/usr/bin/perl print "Content-type: text/plain; charset=utf-8\n\n"; read STDIN, $data, $ENV{'CONTENT_LENGTH'}; print "$data";

kmwrod
質問者

お礼

返信ありがとうございます。 今からCGI.pmを学習するのは大変ですが、やってみます。 おすすめのサイトとかありますでしょうか?

関連するQ&A

  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • CGIファイル1つで掲示板

    1つだけのファイルで一覧型の掲示板を作っています。 HTMLを表示するのもそれです。 フォームで送信すると、自分のファイル自身にアクセスします。 $ENV{'CONTENT_LENGTH'}は受け取ることができたけど read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); では$bufferは空っぽでした。 1つのファイルでPOSTデータの送受信をするのは requireを使わないと無理ですか?

    • ベストアンサー
    • CGI
  • とほほさんのファイルのアップロードのことで

    http://tohoho.wakusei.ne.jp/wwwxx034.htm のファイルのアップローダーを使用しています。 私は普段postのデータを受け取るのに、 read(STDIN,$buffer,$ENV{'content_length'}); のように指定していますが、ここでは $buf = ""; $read_data = ""; $remain = $ENV{'CONTENT_LENGTH'}; binmode(STDIN); while ($remain) { $remain -= sysread(STDIN, $buf, $remain); $read_data .= $buf; } としているみたいです。 ファイルをアップロードするだけなら上記をそのまま使用すればいいのですが、 ファイル名とともに取得したいデータをファイルアップロードの画面でユーザーに指定してもらうので、 そのデータをどのように取得すればいいのかわかりません。 このとほほさんが書いたコードはどのようにデータを受信しているのでしょうか? おわかりの方ご説明お願いします。

    • ベストアンサー
    • Perl
  • FLASHとCGIでのデータの受け渡しについて

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=602714 でも質問をしたのですが、 FLASHとCGIのデータ受け渡しについて質問です。 FLASH側でテキスト入力したものをCGIで受信して表示を、と思ってるのですが、 イマイチうまくいきません。 FLASHのcgi実行ボタンのアクションスクリプトは on(press){ this.getURL("http://***/test.cgi","NAKA","POST"); } test.cgiの中身は read(STDIN,$buffer,$ENV{'content_length'}); ($title,$value)=split(/=/,$buffer); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print "Content-type:text/html\n\n"; print "<FONT COLOR=RED>文字列</FONT><BR>\n"; print "$buffer<BR>\n"; なんてしてみましたが、「文字列」だけきちんと表示されて後は文字化けしてます。 (変換がうまくいってないのかな?) このデータの受け渡しはあってるのでしょうか?間違ってるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • STDINから何度も読み込むことはできますか?

    Perlはかじっている程度の者です。 STDINから全てのデータを read( STDIN, $strRead, $ENV{CONTENT_LENGTH} ); として読み込んで、次に read( STDIN, $strRead, $ENV{CONTENT_LENGTH} ); とすると、もう読み込めませんよね。 なので、 seek( STDIN, 0, 0 ); を毎回呼び出して、ポントを先頭にもっていってから読もうとしたのですが・・だめでした。 そこで質問なのですが、CGIプログラムでSTDINから何度も重複してデータを読み込む方法はありませんか?

    • ベストアンサー
    • Perl
  • 意味を教えてください(CGI)

    CGIの勉強をしています。 以下の意味を教えてください。 ・&error("2222");←"2222"の意味 ・&error("サーバーエラー。#101");←#101の意味 ----------------------------------- &decode; if($orden eq 'enviar' || $preview == '0'){ &enviar; } &previsto; &error("2222"); sub decode{ if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ &error("サーバーエラー。#101"); }

    • ベストアンサー
    • CGI
  • HTML5からのフォーム入力のデータ取得について

    HTML5からのフォーム入力のデータ取得について HTML5で入力フォームを作成しました。 これをCGI(Perl)で入力データを受け取って処理をしたいと考えているのですが HTML4の時みたいに、 if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $querystring, $ENV{'CONTENT_LENGTH'}); } foreach $line (split(/&/, $querystring)){ my ($name, $value) = split(/=/, $line); } このやり方では入力項目の名前と値を取れないのでしょうか? $querystringの中身をみたら、 Content-Disposition: form-data; name="入力項目の名前" 入力した値 という文字の羅列が、入力項目分ありました。 この文字列から一つずつ項目名を拾って、値を拾って。。。 という作業をしないといけないのでしょうか? ネットで色々と探したのですが、 うまいやり方が見つからず、探し方が悪いのかもしれませんが、 どなたかデータの取得のやり方をご存じの方がいらっしゃいましたら 教えてください。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • htmlで呼び出したCGIの出力が文字化けする

    下記のInput.cgiというスクリプト(改行コードLF, 文字コードUTF-8) ---------------- #! /usr/bin/perl $method = $ENV{'REQUEST_METHOD'}; if ($method eq 'POST') { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } elsif ($method eq 'GET') { $buf = $ENV{'QUERY_STRING'}; } print "content-type: text/html\n\n"; print "メソッドは$methodでした。<br>\n"; print "受け取ったデータは$bufでした。\n"; ---------------- があります。これをブラウザで見ると(入力なしのまま) 「メソッドはPOSTでした。  受け取ったデータはxxxでした」 と正常に表示されます。 次に次の内容のhtml(改行はLF,文字コードはShiftJIS) ------------- <html><head> <title>FORMによるデータ転送</title></head> <body> <form method="POST" action="myInput.cgi"> <input type="text" name="text"><br> <input type=submit value="送信"> <input type=reset value="取消"> </form></body></html> -------------- をブラウザで表示させ、inputボックスに英数字(または日本語)を入力し、「送信」をクリックすると、今度はCGIスクリプト中の日本語を含めて総ての日本語出力が文字化けしてしまいます。 これが起きるのは、htmlとCGIの文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

  • CGIでhtmlページを表示する

    連日質問させていただいています。 CGI超初心者です。 htmlファイルにラジオボタンを設置し、 Aを選んだらhttp://www.a.html、 それ以外を選んだらhttp://www.b.html というサイトを開くようなCGIを作成したいです。 以下のようにやってみたのですがうまくいきません。 どのように修正したらいいでしょうか? #============================================ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } $q1 = $FORM{'radio'}; print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ 上記のようにすると、以下のように、ただ文字が表示されてしまいます。 Location: http://www.a.html #============================================ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } $q1 = $FORM{'radio'}; print "charset=Shift_JIS\n\n";←★ print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ ★部分が悪いのかなぁと思い、上記のように修正してみたり、 (Content-Type: text/html; を削除してみました) ★部分を全部削除してみると Internal Server Error となってしまいます。 よろしくお願いいたします!

    • ベストアンサー
    • CGI

専門家に質問してみよう