Perl Perl_2
Perl 「 モジュール 」 CGI 実用的なファイルアップロード 09 エラーの処理手順 (0x116)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x116 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する。その 09 回。「 $CGI::POST_MAX 」で設定したファイルサイズ超過エラーを検知した際の処理手順を確認する。
エラー処理のプログラムコード
(0x10d) から確認している、「 実用的なファイルアップロード 」のためのソースコード ( via: 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;
}
if 文の条件式は (0x113) で、直後のメソッド cgi_error() の出力は (0x114) で確認しました。
ヒアドキュメントのメッセージを出力する
サイズ超過のエラー検知後は、まず、メソッド cgi_erorr() によって HTTP ステータスの内容を出力し、続いて「 ヒアドキュメント 」を利用してより詳細な情報をユーザに案内しています。
ヒアドキュメントの内容は、次のものです。メッセージには日本語も追加しました。出力は HTML で行われるため、文章の整形に「 p 」( paragraph ) 要素と「 br 」( forced line break ) 要素を含めています。
??: 実体参照で記述した br 要素が有効になっているのはなぜなんだぜ ?
print <<'EOT';
<p>
The file you are attempting to upload exceeds the maximum allowable file size.
<br>
( ファイルは あなたがアップロードしようとしている 超えています 最大許容ファイルサイズを. )
<p>
Please refer to your system administrator
<br>
( 照会してください あなたのシステム管理者に. )
<p>
EOT
ヒアドキュメントは、(0xd7) 等で確認した、文字列リテラルをプログラム内に埋め込む手法のひとつです。例えば次の様に、メッセージを変数に代入しておくことも可能です。
my $heredoc = <<'HERE';
こんにちわ。
ヒアドキュメントです。
ふふふ。
HERE
print "$heredoc\n";
スカラ変数「 $heredoc 」を出力すると次の結果が得られます。
こんにちわ。
ヒアドキュメントです。
ふふふ。
この様に、通常ヒアドキュメント内の改行は、改行として処理されるので、改行文字「 \n 」の記述は不要です。しかしながら、CGI プログラムでは、ドキュメントを HTML として出力・表示するため、実用的なプログラムでは、「 p 」要素や「 br 」要素を使って改行/段落を追加している訳です。
Note: ヒアドキュメントを開始する「 << 」と識別子の文字列の間にスペースを入れてはいけません。
罫線と HTML のエンドタグの挿入およびプログラムの終了
ヒアドキュメントのメッセージを出力した後は、HTML の「 hr 」( horizontal rule ) 要素による区切りの平行線と、HTML ページを終了するための「 html 」エンドタグをメソッド「 html_end() 」によって挿入しています。
print $q->hr, $q->end_html;
exit 0;
}
最後に記述された「 exit 0 」は、Perl の組込み関数「 exit 」を使ったプログラムの終了を意味します。引数として渡される数値「 0 」は、正しい処理を行ったことを意味します。
つまり、サイズ超過による CGI エラーを検出したプログラムは、ユーザに必要なメッセージを出力した後で、直ちにプログラムを終了します。
Web ブラウザ上での表示
上記エラー処理による出力は、Web ブラウザ上では次の様に表示されます。ここでは Google Chrome 38.0 を利用しています。

0x116-> 0x117 へ
次回は、ファイルのアップロード処理を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)