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 実用的なファイルアップロード 15 書き込み処理 (0x11c)

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)の記事
 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 ▲