トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Diary/2008-6-18の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
独学日記 ではPerlのPOSTで

 前回の"GetPost.html"を一部を書き換えた次のようなものを用意した。
<pre>
 &lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;データを受け取る&lt;/TITLE&gt;&lt;/HEAD&gt;
 &lt;BODY&gt;
 &lt;FORM ACTION="./GetPost.cgi"  method="post"&gt;
 名前&lt;INPUT TYPE="text" NAME="name" value="hoge"&gt;&lt;BR&gt;
 メール&lt;INPUT TYPE="text" NAME="mail" value="hoge@hoge.com"&gt;&lt;BR&gt;
 郵便番号&lt;INPUT TYPE="text" NAME="zip" value="7777777"&gt;&lt;INPUT TYPE="submit" NAME="zip_q" VALUE="ZIP検索"&gt;&lt;BR&gt;
 &lt;INPUT TYPE="submit" NAME="all" VALUE="実行"&gt;
 &lt;INPUT TYPE="reset" VALUE="クリア"&gt;
 &lt;/FORM&gt;
 &lt;/BODY&gt;&lt;/HTML&gt;
</pre>

 次に,"GetPost.cgi"も書き換えて用意。
<pre>
 #!C:/perl/bin/perl
 read( STDIN, $arg, $ENV{ 'CONTENT_LENGTH' } );
 print "Content-type: text/html\n\n";
 print $arg;
 exit;
</pre>

 ZIP検索を押した場合
 name=hoge&mail=hoge@hoge.com&zip=7777777&zip_q=ZIP%8C%9F%8D%F5

 実行を押した場合
 name=hoge&mail=hoge@hoge.com&zip=7777777&all=%8E%C0%8Ds

 これだけ見れば,"get"と同じ。そこで,送信フォーム側へ新たに「ファイル&lt;INPUT TYPE="file" NAME="file"&gt;」の一文を付けて実行してみたところ,どちらも同様に返値の中に「file=(ファイルのフルパス)」なのが追加されるだけだった。
formタグを書き加え「&lt;FORM ACTION="./GetPost.cgi" enctype="multipart/form-data" method="post"&gt;」とする。

 アップロードをしない形で"get"では,変化はなかったが,"post"では,次のような表示になった。長く続くハイフンと英数がパーティションであり,末尾に"--"がつくとデータの終わりを意味するのだな。
<blockquote>
 -----------------------------7d81b5188b0124 Content-Disposition: form-data; name="name" hoge -----------------------------7d81b5188b0124 Content-Disposition: form-data; name="mail" hoge@hoge.com -----------------------------7d81b5188b0124 Content-Disposition: form-data; name="zip" 7777777 -----------------------------7d81b5188b0124 Content-Disposition: form-data; name="file"; filename="" Content-Type: application/octet-stream -----------------------------7d81b5188b0124 Content-Disposition: form-data; name="all" 実行 -----------------------------7d81b5188b0124--
</blockquote>

 アップロードぉする形では表示が途中から崩れ,なんかバイナリーを受け取ったなと解る。
"post"の受け取りスクリプトにバッファファイルを出力させるようにしてファイル添付しないで実行してみる。
<pre>
 open (OUT,"> temp.dat");
 	binmode(OUT);
 	binmode(STDOUT);
 	print OUT $arg;
 close (OUT);
</pre>

 テキストエディターで開いてみれば,LF(0x0A)で改行されて次のように見える。
<pre>
 -----------------------------7d81b5188b0124
 Content-Disposition: form-data; name="name"
 
 hoge
 -----------------------------7d81b5188b0124
 Content-Disposition: form-data; name="mail"
 
 hoge@hoge.com
 -----------------------------7d81b5188b0124
 Content-Disposition: form-data; name="zip"
 
 7777777
 -----------------------------7d81b5188b0124
 Content-Disposition: form-data; name="file"; filename=""
 Content-Type: application/octet-stream
 
 
 -----------------------------7d81b5188b0124
 Content-Disposition: form-data; name="all"
 
 実行
 -----------------------------7d81b5188b0124--
</pre>

 むふふふふふ,これは以前メールの読み取りで経験したパターンに近い。バイナリーが直接入っている点を除けばむしろこっちが単純な耕造だ。あと,リストボックスとかラジオボタン,チェックボックスなどの動作も確かめとかなくちゃね。でもね,"CGI.pm"モジュールを使うと簡単なんだ。一度蜜の味を知ってしまうとなかなか離れなくってね