Perl Perl_2
Perl 「 モジュール 」 CGI 実用的なファイルアップロード 15 書き込み処理 (0x11c)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x11c 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する。その 15 回。実際のアップロードの処理を請け負うサブルーチンの中から、データの書き込み処理を確認する。
書き込み時の注意点 ( binmode )
Cgi upload - perlmeme.org の例示を元にして、サーバ上へのデータの書き込み処理を確認しますが、その前に例示で記述された "注意書き" を確認します。
例示のコードでは、書き込み用のファイルハンドルをオープンする直前に、次のコメントが記述されています。
If running this on a non-Unix/non-Linux/non-MacOS platform, be sure to set binmode on the OUTFILE filehandle, refer to perldoc -f open and perldoc -f binmode
( もし 実行するなら これを 非 Unix/ 非 Linux/ 非 MacOS プラットフォーム上で, 必ず設定してください binmode を OUTFILE ファイルハンドルに, 参照してください perldoc -f open と perldoc -f binmode を )
内容は、「 Unix/Linux/MacOS 以外の OS でファイルハンドルを OPEN する場合は、"binmode" を使う様に 」というものです。
「 binmode 」とは、「 バイナリモード 」でデータを扱うための Perl の組込み演算子です。この演算子を使えば、ファイルハンドルを通過するデータを「 バイナリデータ 」として扱うことが出来ます。
通常は、イメージ ( 画像 ) ファイルを扱う場合等で利用する演算子ですが、例えば OS が Windwos の場合は、改行文字等の関係から、テキストファイルでも「 binmode 」を有効にすることが推奨されています。
演算子「 binmode 」を含めた「 テキスト / バイナリ 」データについては、(0x47) で確認しました。
アップロード元が Windows の場合は、「 binmode 」を指定しなくても特に問題はないようです。
ファイルアップロードのためのコード
ファイルアップロードのためのプログラムコードは次のものです。原理的には (0x109) の基本処理と変わりありませんが、データ書き込み時のエラー処理等が追加されています。
# 書き込みモードでファイルハンドルをオープン
open ( OUTFILE, ">", "$file" ) or die "Couldn't open $file for writing: $!";
# 関数 read() でファイルを読み込み
while ( $bytesread = read( $filename, $buffer, $num_bytes )) {
# $totalbytes = $totalbytes + $bytesread
$totalbytes += $bytesread;
# バッファの内容を書き込み
print OUTEFILE $buffer;
}
# もし $bytesread の値が undef なら die
die "Read failure" unless defined( $bytesread );
# もし $totalbytes の値が undef なら
unless ( defined ( $totalbytes )) {
# エラーメッセージ
print "<p>Error: Could not read file ${untainted_finename},";
print "or the file was zero length.";
} else {
# $totalbytes が値が undef でなければ完了のメッセージ
print "<p>Done. File $filename uploaded to $file ($totalbytes bytes)";
}
# ファイルハンドルをクローズ
close OUTFILE or die "Couldn't close $file: $!";
0x11c -> 0x11d へ
次回は、上記コードの詳細を確認します。
参考情報は書籍「 初めての 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)