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

CGI tips

ローカルで perl を使うには必要ないけれども、cgi では必要なもの

フォーム(post)からの値を受け取る 21 March 2016

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

別な html へ飛ぶ 21 March 2016

!!! 「\n\n」がないと、500 Internal Server Error になります !!!

if(条件){ 
   print "Location:http://hoge.hoge.jp/hoge.html\n\n";
   exit;
 }

pdfファイルを表示する 21 March 2016

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:2Yesterday:5Total:7927 since 16 March 2016

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 01 Mar 2021 (月) 13:11:40 (1150d)