CGI_Lite.pm-1.62について

Perl初心者の部屋 

CGI_Lite.pm 1.62 について

このページは、CGI_Lite.pmをpod2htmlスクリプトにかけたものを 翻訳したものです。誤訳等ありましたらよろしくご指摘下さい。 なお、万一誤訳等により損害が発生しても免責とさせて頂きます。

名称

WWW フォーム情報を取り扱い、デコードするための CGI Lite v1.62 - Perl 5.0 モジュール


概要

#[訳注]自分の環境を使う時などは、プログラム検索パスとモジュール検索パス #   (下記の場合はカレントディレクトリ)をセット # BEGIN { $ENV{PATH} = '/usr/mylib/bin' # push(@INC, ".") # } use CGI_Lite; $form = new CGI_Lite (); $form->set_platform ("UNIX" or "PC" or "Macintosh"); #[訳注]3つのうち1つをセットします。 $form->set_file_type ("handle" or "file"); #[訳注]2つのうち1つをセットします。 $status = $form->set_directory ("/some/dir"); $form->set_directory ("/some/dir") || die "ディレクトリがありません。\n"; $reference_to_hash = $form->parse_form_data (); %hash = $form->parse_form_data (); $form->print_form_data ();

説明

モジュールはWWW フォーム情報を取り扱い、デコードするために使われます。 GETとPOSTの両リクエストを処理することができます。 POSTリクエストの場合には、情報は2つのMIMEタイプのうちの一方と なるはずです。 application/x-www-form-urlencoded multipart/form-data このモジュールは、非常に軽量であり、また Steven Brenner ( S.E.Brenner@bioc.cam.ac.uk)によるPerl 4.0用の 旧cgi-lib.plの拡張バージョンと考えてもらって構いません。

Form 生成

下記は、ユーザにファイルをアップロードする能力を与えるinput 文の中の ファイル属性を使った簡単なフォームの事例です。 <TITLE>CGI Lite テスト</TITLE> <H1>CGI Lite テスト</H1> <HR> <FORM ACTION="/cgi-bin/test.pl" ENCTYPE="multipart/form-data" METHOD="POST"> あなたの名前は? <INPUT type="text" name="username"> <P> 送信するファイルを選択: <INPUT type="file" name="input_file"> <P> <INPUT TYPE="submit" VALUE="Send the Multipart Form"> <INPUT TYPE="reset" VALUE="Clear the information"> </FORM> <HR>

multipart/form-data MIME ヘッダ

multipart/form-dataヘッダが(Netscape 2.0b1では)どのように見えるかを示します。: -----------------------------239891195122666 Content-disposition: form-data; name="full_name" Foo Bar -----------------------------239891195122666 Content-disposition: form-data; name="picture"; filename="/bar.gif" Content-type: image/gif ... GIF データ ... -----------------------------239891195122666 Content-disposition: form-data; name="readme"; filename="/bar.txt" ... テキスト データ ... -----------------------------239891195122666--

メソッド

下記はあなたのフォームを処理する際に利用できるメソッドです。:

parse_form_data
これは全てのタイプのリクエストを取り扱います。:GET, HEAD およびPOST (両方のエンコードメソッドに対して)。 multipart/form-dataに対して、アップロードされたファイルは ユーザが選択したディレクトリに保存されます。 (set_directory 参照) ファイルは次のような形式で命名されます。 /some/dir/filename.timestamp filenameは``Content-disposition''ヘッダで定義されます。

戻り値

ハッシュへの参照あるいはハッシュそれ自体を戻します。 それには、全てのキー/値のペアが含まれています。 ファイル情報を含むフィールドについては、 その値にはファイルへのパスあるいはファイルハンドルのどちらかが含まれています。 (set_file_type メソッド参照)

制約

このモジュールは1つのフィールド内にある 複数のファイルを取り扱うことはできません。 どちらにしてもNetscape 2.0はこれをサポートしていませんので、 心配には及びません。

set_platform
この関数はアップロードされるテキストファイル用の改行文字を設定します。 その結果、特定のプラットホーム上で適切に表示されるようになります (あなたのHTTP サーバが走っているプラットホーム)。

次のうちいずれかを指定できます。:

UNIX EOL: <LF> PC EOL: <CR><LF> Macintosh EOL: <CR> デフォルトは, ``UNIX''と想定して設定されています。

set_directory
これは、アップロードされたファイルが保存されるディレクトリを 設定するのに使われます。 (multipart/form-dataエンコーディングスキーマに適用するだけ)

この関数は parse_form_data、 を呼ぶ前に呼ばれるべきです。 さもないと、ディレクトリは``/tmp''へデフォルト設定されます。 どんな理由にせよアプリケーションがディレクトリに書き込むことが出来ない場合、 エラーステータスが戻ります。

戻り値

0 失敗 1 成功
set_file_type
デフォルトでは、アップロードされたファイル名は parse_form_data メソッドによって戻されるハッシュの中に保存されます。 しかしながら、このサブルーチンに文字列 ``handle''を渡す場合、 新規に生成されたファイルへのファイルハンドルが戻されます。

この関数は、 parse_form_data を呼ぶ前に呼ばれるべきです。さもないと、ファイル名が戻されます。

print_form_data
全てのキー/値のペアを表示するのに使われます。

戻り値

なし


以下にこのモジュールのいくつかの関数を解説する4つの例を示します。 あなたのフォーム処理プログラムにそのままこれらを使用することができます。

例 1

#!/usr/local/bin/perl5 # print_form_dataメソッドを使ってキー/値のペアを出力 # use CGI_Lite; $cgi = new CGI_Lite () # メソッドからの戻り値は無視される $cgi->parse_form_data (); print "Content-type: text/plain", "\n\n"; $cgi->print_form_data (); exit (0);

例 2

#!/usr/local/bin/perl5 # print_form_dataメソッドと同じ機能を実行する簡単な例 use CGI_Lite; $cgi = new CGI_Lite (); # 戻り値は$dataに保存される。$dataにはハッシュへの参照が含まれている。 # エレメントにアクセスするためには、それを参照分解(dereference)しなければ # ならない。 (例: $$data{'readme'} あるいは %$data) $data = $cgi->parse_form_data (); print "Content-type: text/plain", "\n\n"; foreach $key (keys %$data) { print $key, " = ", $$data{$key}, "\n"; } exit (0);

例 3

#!/usr/local/bin/perl5 # parse_form_data メソッドのコンテキストが # 連想配列である (参照分解が無用!)ということを除いては、 # 以前の例と非常によく似ている。 use CGI_Lite; $cgi = new CGI_Lite (); %data = $cgi->parse_form_data (); print "Content-type: text/plain", "\n\n"; foreach $key (keys %data) { print $key, " = ", $data{$key}, "\n"; } exit (0);

例 4

#!/usr/local/bin/perl5 # multiform/form-dataリクエストの中の"readme" フィールドと関連した # ファイル名を表示する簡単な例t use CGI_Lite; $cgi = new CGI_Lite (); # ディレクトリが無効(例:存在しない、読出や書込ができない、 #あるいはディレクトリではない)であればDieする。 $cgi->set_directory ("/usr/shishir") || die "ディレクトリが存在しない。\n"; # Set the platform (とりあえずUNIXをデフォルトとした) $cgi->set_platform ("UNIX"); # ファイルハンドルを戻すようモジュールに伝える $cgi->set_file_type ("handle"); $data = $cgi->parse_form_data (); print "Content-type: text/plain", "\n\n"; # ファイルハンドルを得る変数を参照分解(dereference)する。 # それからそのファイルを繰り返し読込み、STDOUTへ各行を表示する。 # # 注意: $filenameはファイルの名前も含んでいる。 $filename = $$data{'readme'}; while (<$filename>) { print; } # 確実にファイルハンドルをcloseする。 close ($filename); exit (0);

例 5

#!/usr/local/bin/perl5 # キー/値のペアを簡単に表示する。下記に、 # multipart/form-dataリクエストに対して出力がどのように見えるのかを示す。 # # Content-type: text/plain # # full_name = Foo Bar # picture = /usr/shishir/bar.gif_812186386 # readme = /usr/shishir/bar.txt_812186386 use CGI_Lite; $cgi = new CGI_Lite (); $cgi->set_directory ("/usr/shishir") || die "ディレクトリが存在しない。\n"; $data = $cgi->parse_form_data (); print "Content-type: text/plain", "\n\n"; $cgi->print_form_data (); exit (0);

参照

さまざまな他のPerl 5.0 CGI モジュールもみるべきですし、 あなたに最もよく合うものを使用すべきです。 さらに多くの情報が入用なら、下記でCGI モジュール開発リストを 購読することができます。

CGI-perl@webstorm.com

詳細は、Marc Hedlund (hedlund@best.com) に連絡を取って下さい。 このリストは一般的なCGI サポート用ではありません。 Perl 5.0 CGI モジュール開発だけを取り扱っています。

CGI モジュールは Lincoln Stein (lstein@genome.wi.mit.edu) によって保守されており、彼のWWW サイトで見つけることができます。

http://www-genome.wi.mit.edu/WWW/tools/scripting


改訂履歴

v1.62 - 1月17日,1996年
parse_multipart_data サブルーチンを修正し、 set_file_typeが ``handle'' パラメータでcallされる場合は、 ファイルハンドルとしてファイル名を戻すようになった。

callしているパッケージを決定するためにdetermine_package関数を追加した。

v1.61 - 1月1日,1996年
マイナーなバグ修正の結果、 あるバイナリファイルからは行末文字が取り除かれるようになった。

v1.6 - 12月30日, 1995年
ブラウザが``Content-Disposition''ヘッダの後に送信する(であろう)他のヘッダ情報を 処理するためのコードを追加。

set_platform 関数を追加。アップロードされたテキストファイルが 正しく表示されるようになった。

関数 set_file_type はもうステータスを戻さない。

コード内のspacingを訂正。

v1.5 - 11月13日, 1995年
(その前のフィールドが大きすぎたか小さすぎた時に)いくつかのフィールドが失われるという、 2つの重大なバグを訂正。

正規のフォームフィールドの中に``\r\n'' 文字がないことを確実にするコードを追加。 異なったプラットホーム(例: MacintoshPC) から アップロードされた情報を含んだTextarea エレメント及びフィールドは ``\r'' 文字を含むようになるでしょう

v1.4 - 10月15日, 1995年
pod スタイルの資料を追加。次のようにすることでマニュアルページを参照できるように なった。

pod2man CGI_Lite.pm | nroff -man | more [訳注:このnroffコマンドはmanページを整形するものでおそらくUNIX以外では使えません。 Windowsではpod2htmlスクリプトの方が便利でしょう。]

また、parse_form_data メソッドを修正し、(配列コンテキスト内でcallされた場合)実際の連想配列を戻すことが できるようになった。

v1.3 - 10月12日, 1995年
parse_multipart_data メソッドを完全に修正。もう マルチパートメッセージを行毎に読んだりせず、 、かなりの小型ブロック(あるいは ``chunks'')で読むようになった。 また、Netscapeをハングさせていた主要なバグを排除した。

いくつかのブラウザはヘッダ行の終わりで``\r\n''文字列を送信しないので、 。parse_multipart_data メソッドはそれらが あるかどうか調べて削除する。 またこれで、ファイルにサンプルリクエストを保存して、それを プログラムにパイプで渡すことでmultipart/form-dataリクエストを エミュレートすることができるようになった。

cat multipart.txt | test.pl
v1.2 - 10月12日, 1995年
保存されたファイル用のファイルハンドルを戻すメソッドを set_file_type に追加。

v1.1 - 10月10日, 1995年
環境変数CONTENT_TYPEがエンコード部分の種別を決定するのに使われる。 v1.0では、POSTリクエストの本体部が構文解析されていた。

無効なディレクトリが set_directory メソッドに渡された場合、 このモジュールはもうエラー メッセージを吐き出さない。 代わりに、失敗を示す 0というステータスを戻す。

v1.0 - 9月 26日, 1995年
初期リリース


著作権情報

Copyright (c) 1995 by Shishir Gundavaram All Rights Reserved Permission to use, copy, and distribute is hereby granted, providing that the above copyright notice and this permission appear in all copies and in supporting documentation.