萌えPerl
しきり線
大項目 フォーム
正規表現たん
 CGIが実行されるのはページを呼び出されるだけのときもありますし、何らかの値を受け取って処 理をしてから動的に表示をする場合もあります。
 ここではまずよく使うHTMLのフォームを使ってCGIに値を渡す方法を説明します。
 では以下のソースを見てください。

 データーを渡すHTMLのページ(seme01.html)

<html><head><title>TEST SEME</title></head>
<body>
<form action="cgi-bin/uke01.cgi" method="post">
  何か入力して送信するとその文字が表示されます。<br>
  <input type="text" name="x" size="8">
  <input type="submit" value="送信">
</form>
</body>
</html>

 データーを受け取るCGIのページ(uke01.cgi)

#!c:/perl/bin/perl
use CGI;
my $form = new CGI;
my $x = $form->param('x');
print "Content-type: text/html; charset=Shift_JIS\n\n";
print 'おまえは「'. $x . '」と言う';
 これをそれぞれ以下の場所に保存します。

C:\Program Files\Apache Group\Apache2\htdocs\seme01.html
C:\Program Files\Apache Group\Apache2\cgi-bin\uke01.cgi

 すると次のような画面になります。↓をクリックしてみてください。

ウインドウを開く                    

中項目 <FORM></FORM>
正規表現たん
 まずHTMLのほうですが、
 <form></form>がCGIにデーターを送信するためのタグです。
 これにはさまれている送信用のタグ全てが送信対象になります。
 送信ボタンを押すことによってCGIにデーターを送ります。
 以下にそのオプションを記します。
 最低でも action と method だけは入力しないと動きません。逆に言うとそれだけあれ ばとりあえず動きます。

<form>…</form>
action送信先のURL
method転送方法(GETかPOST、まあだいたいPOST)
enctypeデータ形式(MIMEタイプ)
accept-charset受け側の文字コード
accept受け側のMIMEタイプ
name参照用の名前
target結果を表示用のフレームか窓

中項目 <INPUT></INPUT>,<TEXTAREA></TEXTAREA>
正規表現たん
 <input></input>は送信用のタグです。
 オプションの type によって形が変わります。

<input>…</input> の type="タイプ"
text文字
passwordパスワード
fileアップロード
checkboxチェックボックス
radioラジオボタンさこつうなじ
selectセレクトボックス
hidden隠しフィールド
submit送信ボタン
reset取消ボタン
buttonボタン
image画像ボタン

 テキストエリアも送信用のタグとして使用します。
 inputのテキストが1行なのに対してこれは複数行扱えます。
<textarea>…</textarea>


以下、属性一覧です。
共通属性
accesskey=key例えば accesskey=X としておくと「ALT」+「X」でフォーカスされます。
disabledこれを指定すると無効化されます。
tabindex=nタブでフォーカスされる順番です。
type=type入力形式。
datafld=datafldデータバインド機能を用いる際、列名を指定します。
datasrc=datasrcデータバインド機能を用いる際、ID を指定します。

一般属性
class=classクラスを指定します。
dir=dir文字の表示方向を指定します。
id=idIDを指定します。
lang=lang言語を指定します。
language=languageスクリプト言語を指定します。
name=nameCGIに渡す時の名前です。
変数名と同じにしておくと分かりやすいです。
style=styleスタイルシートを指定します。
title=titleタイトルを指定します。

type=textの属性
autocomplete=onoffoffにするとオートコンプリート機能を無効にします。
istyle=ni-mode用入力モード初期値。1:全角文字、2:半角文字、3:英字、4:数字。ポケットベル入力時は。1:全角文字、2:半角文字、3:小文字推奨半角文字、4:数字推奨半角文字
maxlength=n最大入力文字数。
readonly入力不可。
size=n入力フィールドの大きさ。
value=value入力フィールドの初期値。
<input type="text" name="adr" maxlength="50" size="50"></input>

type=passwordの属性
autocomplete=onoffoffにするとオートコンプリート機能を無効にします。
maxlength=n最大入力文字数。
readonly入力不可。
size=n入力フィールドの大きさ。
value=value入力フィールドの初期値。
<input type="password" name="pass"></input>

type=fileの属性
accept=accept送信するデータのMIMEタイプの候補リストをカンマで区切ります。
maxlength=n最大入力文字数。
size=n入力フィールドの大きさ。
<input type="file" name="image" size="44"></input>

type=checkbox、type=radioの属性
checkedあらかじめチェックした状態にしておきます。
valueオン時の値。
<input type="checkbox" value="1" name="nanikano_chk"></input>
<input type="radio" name="sex" value="1" checked>男
<input type="radio" name="sex" value="3">女
<input type="radio" name="sex" value="5">他

selectの属性
name=nameフォーム部品を識別するための名前。
size=n1:プルダウン、2 以上:リスト形式。
multiple複数選択。ex.※「Shift」または「Ctrl」キーを押しながらクリック。
value=value送信される文字列。
label=str表示されるテキスト。
selected選択された状態。
<form method="post" action="hoge.cgi">
<p>
<select name="hoge1">
<option value="">選んでください</option>
<option value="1">高坂 桐乃</option>
<option value="2">田村 麻奈実</option>
<option value="3">沙織・バジーナ</option>
<option value="4" selected>黒猫</option>
</select>
</p>
<p><input type="submit" value="送 信"></p>
</form>

type=hiddenの属性
valueオン時の値。
<input type="hidden" name="page" value="top"></input>

type=submit、type=reset、type=buttonの属性
valueボタンに表示するテキスト。
<input type="submit" name="login" value="ログイン">
<input type="reset" name="clear" value="クリア">
<input type="button" name="start" value="スタート">

type=imageの属性
align=align表示位置。
alt=alt画像の代わりに表示するテキスト。
border=n枠線の太さ。
dynsrc=url動画(*.avi)を表示。
height=n画像の高さ。
ismapクリッカブルマップを使用します。
lowsrc=url画像を転送する間に表示する容量の小さい画像の URL
src=url画像の URL
width=n画像の横幅。
<input type="image" name="up" src="img/uppoint.gif">

textareの属性
name=nameCGIに渡す時の名前です。
変数名と同じにしておくと分かりやすいです。。
cols=n入力フィールドの横幅を数値で指定します。
rows=n入力フィールドの高さを数値(行数)で指定します。
wrap=wrap自動改行のタイプを指定します(hard、soft、off)。
<textarea name="intext" rows="2" cols="40">あらかじめ入れておきたい何かの文字</textarea>
    自動改行のタイプ
  • hard:自動改行が入ります。送信される内容にもその改行が維持されます。
  • soft:自動改行が入りますが、送信される内容にはその改行は入りません。
  • off :自動改行は入りません。横スクロールしながら延びていきます。

中項目 CGIで受け取る
正規表現たん
 CGIの方ではモジュールの使用によって簡単に受け取ることが出来ます。
 さきほどの例をみてみましょう。

#!c:/perl/bin/perl
use CGI;
my $form = new CGI;
my $x = $form->param('x');
print "Content-type: text/html; charset=Shift_JIS\n\n";
print 'おまえは「'. $x . '」と言う';

 まず use CGI; は「CGIモジュールを使いますよ」 と言う意味です。そして my $form = new CGI; は「その モジュールを $form という名前で使いますよ」という意味で、 $form->param('x')は「送信されてきたデーターのなかで「x」と名づけられたデ ーターの値」という意味です。
 まとめると
  1. 最初に use CGI; my $変数名 = new CGI; と書く。
  2. 送信された値は $変数名->param('HTMLのINPUTのNAMEで付けられた名前')。
 ですねー。
 モジュールとはサブルーチンだけが書かれたテキストファイルで、use は他のテキスト ファイルをはじめに取り込む命令で、-> は「その中身にある」ぐらいの意味で、param はCGIモジュールの中に書かれているサブルーチン名です。(ためしに以下の場所にあ るファイルの中を検索すると sub param { というサブルーチンがあります)
C:\Perl(←或いはActivePerlをインストールした場所)\site\lib\CGI.pm
(モジュールについては後で詳しく説明します)

 これでひとまずブラウザーから入力された値を受け取ることができます。

中項目 添付ファイルを受け取る
正規表現たん
 フォームに入力されたデーターを param で受け取ることは出来ましたが、type=file でファイルのアップロードをするのはちょっとややこしいです。
 とりあえず例を見てください。

 データーを渡すHTMLのページ(seme02.html)

<html><head><title>TEST SEME</title></head>
<body>
<form action="cgi-bin/uke.cgi" method="post" enctype=multipart/form-data>
  画像をアップロードします。<br>
  画像ファイルを選んで送信をクリックして下さい。<br>
  <input type="file" name="image" size="44"><br>
  <input type="submit" value="  送  信  ">
</form>
</body>
</html>

 データーを受け取るCGIのページ(uke02.cgi)

#!c:/perl/bin/perl
use CGI;
my $form = new CGI;

# ファイル名
my $updfile = $form->param('image');
my $savename=(reverse(split /\\/,$updfile))[0];
my $buffer;

# ファイル保存
if ($updfile) {
  open (FILE, "> $savename");
  binmode(FILE);
    while (read($updfile,$buffer,1024)) {
      print FILE $buffer;
    }
  close (FILE);
}

print "Content-type: text/html; charset=Shift_JIS\n\n";
print '以下のファイルをアップロードしました<br>'; print $updfile .'<br>';; print $savename;
 これをそれぞれ以下の場所に保存します。

C:\Program Files\Apache Group\Apache2\htdocs\seme02.html
C:\Program Files\Apache Group\Apache2\cgi-bin\uke02.cgi

 そして、ブラウザーのURL欄に

http://localhost/seme02.html

 と入力するとアップロード画面が出て、実際にアップロードできるようになります。ア ップロードされたファイルは uke.cgi と同じフォルダーに保存されます。
 これはごく単純な最小限のソースです。
 実際には拡張子のチェックや容量のチェック、ロック処理などいろいろ準備したほうが 良いのですが、ローカルでのアップロードのテストはこれで可能です。
  • HTML側の<form>タグ内に enctype=multipart/form-data を書きます。
  • (reverse(split /\\/,"ディレクトリとファイル名"))[0] は文字操作や正規表現でファイル名だけを抜き出しています。他にもいろいろ方法はあり ますし、保存するファイル名を固定にするなら不要です。
  • if ($updfile) は「入力値があるなら処理するお」 という感じの意味です。
  • open (FILE, "> $savename"); ファイルを書き込み モードで開きます。→保存するファイル名と場所を指定します。
  • binmode(FILE); ファイルをバイナリモードで処理し ます。サーバーが unix ならどっちでも良いですが Windows では必須です。
  • while (read($updfile,$buffer,1024)) ファイルを 1024バイトずつ読んで $buffer に代入します。それをデーターが全部読み終わるまで繰り 返します。べつに1024でなくてもなんでも良いです。
  • print FILE $buffer; 保存用のファイルに書き足します。
  • close (FILE); 「処理が終わったお」と言う意味で す。無くてもプログラムが終わったら勝手にクローズしますが一応書くほうがおりこうち ゃんぽいので書きます。
 いじょうです。
 ファイルの操作も後で説明します。(^-^;「後で」が多いですね。