blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_2

Perl 「 モジュール 」 CGI 実用的なファイルアップロード 06 ファイルサイズチェック (0x113)

Perl 「 モジュール 」 CGI 実用的なファイルアップロード 06 ファイルサイズチェック (0x113)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x113 回。

CGI.pm で、実用的なファイルアップロードの処理を確認する。その 06 回。「 $CGI::POST_MAX 」で設定したファイルサイズのチェック方法を確認する。



プログラム $CGI::POST_MAX のチェック



今回は、Cgi upload - perlmeme.org で紹介されている、アップロードファイルのサイズチェック手順を確認します。


if (!$q->param('filename') && $q->cgi_error()) {
print $q->cgi_error();
print <<'EOT';
<p>
The file you are attempting to upload exceeds the maximum allowable file size.
<p>
Please refer to your system administrator
EOT
print $q->hr, $q->end_html;
exit 0;
}



ファイルのサイズチェックでは、指定したサイズ以上のファイルのアップロードを検知した場合に、エラーメッセージを表示してプログラムを終了させます。


論理否定演算子 ! と 論理積演算子 && とメソッド cgi_error()



サイズチェックは if 制御構造 ( if 文 ) を利用して行います。その条件式は次の様に書かれています。


if (!$q->param('filename') && $q->cgi_error()) {



ここでは、論理否定演算子「 ! 」と論理積演算子「 && 」、それと、メソッド「 cgi_error() 」を利用しています。条件式の内容を言葉にすると、次の様になります。

ファイル名が "空" かつ cgi_error() に値が入っていた場合に "真" と判定する



論理演算子



論理演算子は、(0x89) および (0x8a) で確認しましたが、改めて確認します。

論理否定演算子「 ! 」は、論理否定「 NOT 」の真偽判定を行うので、真偽 の判定を逆転します。

この演算子が次の様に使われているということは、メソッド param() で取得したファイル名が「 空 」( や undef ) だった場合に「 真 」を返すことを意味します。


!$q->param('filename')



論理積演算子「 && 」は、論理積「 AND 」の真偽判定を行うので、与えられた条件がすべて満たされた場合のみ 真 と判定します。

この演算子が次の様に使われているということは、ファイル名が「 空 」であり、かつ、メソッド cgi_error() が「 値を持っている 」場合のみ「 真 」を返すことを意味します。


!$q->param('filename') && $q->cgi_error()




メソッド cgi_error()



(0xc8) で確認したメソッド「 cig_error() 」は、入力処理中のエラーを取り出すことが出来るメソッドですが、これまでは、その機能や意味をあまり理解出来ていませんでした。

なぜならば、このメソッドを使った実際のプログラムコードを書いたことがなかったからです。ですから、今回の実用的なコードの確認は、メソッド cgi_error() 」の動作を理解する良い機会になりました。

メソッド cig_error() の機能は、perldoc.jp の「 CGIエラーの取り出し 」で次の様に書かれています。

特にアップロードされたファイルを処理している 間にエラーが発生することがあります。 これらのエラーが発生したとき、CGI は処理を止め、空のパラメータリストを 返します。 エラーの存在とその性質を cgi_error() 関数を使って調べることが出来ます。 エラーメッセージは HTTP ステータスコードとしてフォーマットされます。


この引用文の中には、今回の処理に関わる 2 つの重要なポイントがあります。


空のパラメータリストを返す



CGI.pm は、処理中にエラーが発生した場合、「 空のパラメータリストを返す 」と言います。

つまり、論理否定演算子「 ! 」を利用した「 !$q->param('filename') 」の記述は、空のパラメータが返されたかどうかを確認している訳です。

しかしながら、ただパラメータが空であるだけなら、エラーが発生したことを意味することは出来ません。なぜなら、ユーザがファイル名を指定せずに投稿ボタンを押下する場合が考えられるからです。

Note: 空のファイル名を投稿するだけでは CGI エラーにはならない様です。

そのため、if 文の条件式では、併せて「 && cgi_error() 」を記述します。メソッド cgi_error() が、なんらかのデータを持っているかどうかを確認することで、はっきりとした CGI のエラーを検知する様にしてある訳です。


エラーの存在と性質を確認出来る



CGI.pm の処理中にエラーが発生した場合は、空のパラメータリストが返されることと同時に、メソッド「 cgi_error() 」に「 HTTP ステータスコード 」のデータが格納されます。「 && cig_error() 」の記述は、このデータが入っているかを確認しています。

つまり、次の if 文の条件式が「 真 」であった場合は、CGI.pm の処理に、なんらかのエラーが発生していることを意味します。


!$q->param('filename') && $q->cgi_error()




0x113 -> 0x114 へ



次回は、アップロードファイルのサイズオーバによる、CGI エラーにより生成される HTTP ステータスコードを確認します。


参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index

















同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲