CGI tips プログラムなどなど6
ローカルで perl を使うには必要ないけれども、cgi では必要なもの
CGI Programing with Perl 5.4フォーム処理のCGI例(METHOD="post"の場合) の一部を再掲させていただきました。そのままです。 もっと有用なことも書いてあるのですで、そちらを参考下さいませ。
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">
!!! 「\n\n」がないと、500 Internal Server Error になります !!!
if(条件){ print "Location:http://hoge.hoge.jp/hoge.html\n\n"; exit; }
CGI-BBS > CGI > Perl > PDFファイルのCGI経由での表示 の会話から要約すると……
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
2021年3月1日追記:「Content-Transfer-Encoding: binary」はダウンロードさせるのがテキストファイルであっても、binary でよいようです(エラーにならず動く)
2021年3月1日訂正:here document の内の最後は空の改行が必要なのが抜けていた(binaryの次に空の改行が必要)ので、追加しました。
Today:1 | Yesterday:1 | Total:7892 since 16 March 2016 |