CGI tips プログラムなどなど6 #contents * CGI tips [#ze877ab3] ローカルで perl を使うには必要ないけれども、cgi では必要なもの ** フォーム(post)からの値を受け取る 21 March 2016 [#xbe6ed04] CGI Programing with Perl [[5.4フォーム処理のCGI例(METHOD="post"の場合)>http://www.aikis.or.jp/~s-suzuki/cgilabo/kouza/cgi2.html#cgilabo54]] の一部を再掲させていただきました。そのままです。 もっと有用なことも書いてあるのですで、そちらを参考下さいませ。 http://www.aikis.or.jp/~s-suzuki/cgilabo/kouza/cgi2.html#cgilabo54 より $length = $ENV{'CONTENT_LENGTH'}; # パラメータ文字列の長さ read(STDIN, $buffer, $length ); # 長さ分だけ標準入力から読み込む ($arg1,$arg2) = split( /&/ , $buffer ); #パラメータごとに分割 ($name1,$value1) = split( /=/ , $arg1 ); #フォーム名と内容に分割 ($name2,$value2) = split( /=/ , $arg2 ); # 〃 $value1 =~ tr/+/ /; # フォーム形式の + を、スペースに変換 $value2 =~ tr/+/ /; # 〃 # フォーム形式の特殊文字・漢字を変換する処理 $value1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; こんな感じ(↓)のフォームのhtmlからデータを受け取るときです。 パラメータは2つではありませんが……、 text、textarea、radio、select の受け取りも同じということで。 <form name="form1" id="form1" method="post" action="https://kyotofly.kit.jp/cgi-bin/tools/pigen.cgi"> <table> <tr> <th>Your Name</th> <td> <input type="text" size="75" maxlength="200" name="username" id="username" /> </td> </tr> <tr> <th>Numbers </th> <td> <textarea cols="50" rows="3" id="inputnums" name="inputnums"></textarea> </td> </tr> <tr> <th>Shipping Type</th> <td> <input type="radio" name="shiptype" value="air" checked> Air Mail <input type="radio" name="shiptype" value="EMS"> EMS (Express Mail Service) <input type="radio" name="shiptype" value="Registered"> Registered Air Mail </td> </tr> <tr> <th>Country</th> <td> <select id="usercountry" name="usercountry"> <option value="NA">-- Select Your Country --</option> <option value="Afghanistan">Afghanistan</option> <option value="Albania">Albania</option> (略) <option value="Zambia">Zambia</option> <option value="Zimbabwe">Zimbabwe</option> </select> </td> </tr> </table> <input type="submit" value="Submit"> <input type="reset" value="Clear all"> ** 別な html へ飛ぶ 21 March 2016 [#e00fdc8c] !!! 「\n\n」がないと、500 Internal Server Error になります !!! if(条件){ print "Location:http://hoge.hoge.jp/hoge.html\n\n"; exit; } ** pdfファイルを表示する 21 March 2016 [#l95a383f] [[CGI-BBS > CGI > Perl > PDFファイルのCGI経由での表示>https://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020307102821.shtml]] の会話から要約すると…… pdfファイルが(対応していれば)ブラウザのウィンドウの中に表示される - filename=$downloadpdf は保存するときの(ダウンロードさせたい)ファイル名を指定する。実体とは別な名前でも構わない。ディレクトリ名は含ませてはいけない(Firefox では、「\」は「_」に変換された)。 - open (PDF, "<$mypdf"); は表示させる pdfファイルを指定する。当然ながら実体を指定する。ディレクトリも含んでよい。 - ブラウザには、cgi の URI が表示されるので、pdfファイルの実体は安全なところに隠せる。 print << "MYHTML"; Content-type: application/pdf Content-disposition: inline;filename=$downloadpdf Content-Transfer-Encoding: binary MYHTML open (PDF, "<$mypdf"); binmode(PDF); while(read(PDF, $value, 4096)){ print $value; } close(PDF); pdfファイルをダウンロードさせる(ダイアログを表示させる)には、inline の代りに attachment とする Content-disposition: attachment;filename=$mypdf |Today:&counter(today);|Yesterday:&counter(yesterday);|Total:&counter(); since 16 March 2016|