CGI tips プログラムなどなど6


* 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|

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS