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 ファイルアップロード時のプログレスバー (0x124)

Perl 「 モジュール 」 CGI ファイルアップロード時のプログレスバー (0x124)

目次 - Perl Index



Theme



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

CGI.pm の、「 ファイルアップロードフック 」という機能を通して、アップロード時の 「 プログレスバー 」( progress bars : 進捗表示のバー ) の表示方法を確認する。



プログレスバー



「 プログレスバー 」( progress bars ) とは、対象とする処理が、全体の何割程度進んでいるかの進捗を表す機能です。ファイルのインストール等でお馴染みの機能でもあります。

Perl モジュール CGI.pm では、「 ファイルアップロードフック 」という機能を通じて、プログレスバーの表示を実現できると言います。

「 ファイルアップロードフック 」は、プログレスバー専用の機能ではなく、処理に対する「 低レベル 」なアクセスの提供を目的とした機能です。 ここでいう「 低レベル 」とは、処理レベルのより深い層を指しています。

「 ファイルアップロードフック 」は、プログレスバーの表示の他に、一時ファイル ( temporary file ) の使用を完全にオフする等を行うことも出来ます。

これは、別の Perl モジュール「 Apache::Request 」が提供する "UPLOAD_HOOK" という機能 によく似ていますが、CGI.pm は、その引数に「 リモートファイル名 」( アップロード対象になるファイル名 ) を利用する点が異なるそうです。


ファイルアップロードフックのコード



ファイルアップロードフックの利用に際して、CGI.pm "Progress bars for file uploads and avoiding temp files" - perldoc.jp では、次のコードが例示されています。


$q = CGI->new(\&hook [,$data [,$use_tempfile]]);

sub hook {
my ($filename, $buffer, $bytes_read, $data) = @_;
print "Read $bytes_read bytes of $filename\n";
}



まず、サブルーチン「 hook 」 ( のリファレンス ? ) と一緒に CGI オブジェクトに渡している ( 渡すことが出来る ) 値を確認します。

「 $data 」のフィールドは、オプションだと言います。解説には次の様にありますが、現時点の僕は理解出来ていません。

これにより、フックした コールバックに設定情報 (データベースハンドルなど) を渡せます。


「 $use_tempfile 」のフィールドは、アップロード処理をする際の、一時ファイル ( temporary file ) の利用を 真偽 値で設定します。この値は、これまで (0x121) 等で確認した通り、デフォルトでは 真 ( 利用する ) に設定されています。

もし、一時ファイルを利用しない設定 ( 偽 ) とした場合、アップロードされたファイルの情報を得る手段は、フック経由のみになります。つまり、「 $q->param('upload_file') 」は機能しないということです。


ファイルアップロードフックの利用



上記例示のコードを、「 ファイルアップロード処理 プログラムコード まとめ (0x11e) 」のプログラムコードにそのまま追加して実行してみましたが、エラーが出てしまいました。

雰囲気的に案の定という感じではありますが、今の僕には、何故にエラーが発生するのか、その手掛かりが掴めません。

サーバ上の状況を確認すると、ファイルアップロードそのものは、正常に完了している様なので、余計に何が原因なのかが分からなくなります ( 表示系のエラー ? )。

そもそも、今の僕は、「 アップロードフック 」がなんであるか、その有用性はどこにあるか、等をまったく理解していないので、原因は分からないのが道理です。


Ajax



CGI.pm が提供する「 アップロードフック 」を利用したプログレスバーの生成方法を調査したところ、どうやら、CGI.pm だけではなく、「 Ajax 」等を利用した動的な処理を別途記述する必要があることが分かりました。

Wikipedia によれば、「 Ajax 」( Asynchronous JacaScript + XML ) は、Web ブラウザを通じた非同期通信やインータフェイスの構築を行う技術の総称です。

Ajax は、予め Web ブラウザに実装された JavaScript を利用して非同期通信を行い、ページのリロードを伴わない動的な表現を可能としたものだとのことです。


コピーでペー



Ajax どころか、JavaScript の理解も浅い僕は、次の Web ページにて ( プログレスバーの表示を実装したと思われる ) それらしきプログラムコードを発見しました。

Perl Upload Progress Bar - TEK-TIPS FORUMS

ここでの例示では、HTML ページ用のファイル ( upload.html ) と、ファイルアップロード処理用のファイル ( uploadl.cgi ) が用意されています。

HTML のページを生成するファイル「 upload.html 」側で、フォームの生成や Ajax の呼び出しを行っています。

ファイルアップロードの処理を行う「 upload.cgi 」は、upload.html の中で「 XMLHttpRequest() 」というモジュール ( ? ) の「 open 」というメソッド ( ? ) を使って呼び出しています。

「 upload.cgi 」の中では、CGI オブジェクト作成「 my $q = new CGI (\&hook); 」直後に記述したサブルーチン「 hook 」で、perldoc の例示以上の処理を、なにやらワラワラと書いています。

これらのコードを検証領域にコピーでペーして、実行したところ、ひとまずは、それらしき動作を確認することが出来ました。

ファイルアップロード 実用的なコード 00 (0x10d) 」から始めた確認作業の様に、このプログラムコードも細かく検証しようかと思いましたが、「 Ajax 」の存在によって、とりあえずの目的である CGI.pm のドキュメント確認から大きく逸脱する可能性を感じるため、現時点ではサスペンドしておくこととしました。


0x124 -> 0x125 へ



現時点でこのブログの目的は、モジュール「 CGI.pm 」のドキュメント確認になっていますが、本来の目的は、「 初めての Perl 第 6 版 」の内容をひとつずつ確認することです。

次回は、「 ポップアップメニュー 」の作成方法を確認します。


参考情報は書籍「 初めての 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 ▲