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.pm フォーム ファイルアップロードの動作確認 (0x10a)

Perl 「 モジュール 」 CGI.pm フォーム ファイルアップロードの動作確認 (0x10a)

目次 - Perl Index



Theme



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

CGI.pm で作成したファイルアップロードフィールドにて指定した、ローカルファイルのアップロード処理の動作を確認する。



ファイルアップロードに利用するプログラムコード



(0x109) までに確認した、ファイルをアップロードするための HTML フォームおよび基本的な処理の Perl プログラムコードは次のものです。ファイルをアップロードするための処理は 49 行目から 68 行目の部分で行います。


#!/usr/bin/perl

use warnings;
use strict;

use CGI::Pretty;

my $q = CGI->new();

# HTTP ヘッダ
print $q->header(-charset => 'euc-jp');

# HTML ヘッダ
print $q->start_html(-title => 'form create',
-style => {'src' => './style/style00.css'},
-lang => 'ja',
-encoding => 'euc-jp',
);

# 見出し h3, h4
print $q->h4('ファイルフィールド');

# div スタート
print $q->start_div({-class => 'test_txt'});

# form スタート
print $q->start_form();

# メソッド filefield() の設定
print "filefield";
print $q->p($q->filefield(-name => 'upload',
-default => 'default',
-size => 50,
-maxlength => 80));

# 投稿ボタン
print $q->p($q->input({ -type => 'submit',
-value => 'submit'}));

# form エンド
print $q->end_form();

# div エンド
print $q->end_div();

#--- アップロード処理 ---

# ファイル名兼ファイルハンドル (?) の取得
my $filename = $q->param('upload');

# ディレクトリ UPFILE 直下にオリジナルファイル名で保存
my $output_file = "UPFILE/$filename";

# read() のための変数を宣言
my ($bytesread, $buffer);
my $numbytes = 1024;

# 書き出しモードでファイルハンドルをオープン
open (OUTFILE, ">", "$output_file")
or die "Could't open $output_file for writing: $!";

# read() でデータを読み込み OUTFILE に書き出し
while ($bytesread = read($filename, $buffer, $numbytes)){
print OUTFILE $buffer;
}

# ファイルハンドルクローズ
close OUTFILE;

# HTML エンド
print $q->end_html();




HTML プログラムコード



上記 Perl コードから得られる HTML のプログラムコードは次のものです。ファイルアップロードのための処理部分は表示されません。


Content-Type: text/html; charset=euc-jp

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>form create</title>
<link rel="stylesheet" type="text/css" href="./style/style00.css" />
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
</head>
<body>
<h4>
ファイルフィールド
</h4>
<div class="test_txt">
<form method="post" action="http://localhost?upload=.%2Findex.ht" enctype="multipart/form-data">filefield<p>
<input type="file" name="upload" value="./index.ht" size="50" maxlength="80" />
</p>
<p>
<input type="submit" value="submit" />
</p>
</form></div>

</body>
</html>




Web ブラウザでの動作



Web ブラウザでの表示は既に確認した通り、次の様になります。

Perl 「 モジュール 」 CGI.pm フォーム ファイルアップロードの動作確認 (0x10a)

[ ファイルを選択 ] ボタンを押下すると、ローカルファイルの選択ウィンドウが開きます。今回は、アップロードのテスト用に次の内容を入力したファイル「 up_file.txt 」を用意しました。

CGI.pm を利用した
ファイルアップロードのための
Perl プログラムテスト用のファイル。

無事にアップロード出来るかを確認する。


これを選択し [ 開く ] ボタンを押下します。

Perl 「 モジュール 」 CGI.pm フォーム ファイルアップロードの動作確認 (0x10a)

すると、[ ファイルを選択 ] ボタンの右横に、選択したファイル名が表示されるので、このまま [ submit ] ボタンを押下します。

Perl 「 モジュール 」 CGI.pm フォーム ファイルアップロードの動作確認 (0x10a)

[ submit ] ボタンを押下後は、初期の表示に戻ります。


リモート上でアップロードされたファイルを確認



アップロード先は、Perl プログラム 52 行目でスカラ変数 $output_file に指定したディレクトリ「 UPFILE/ 」の直下です。ファイル名はメソッド param() で取得したオリジナルのファイル名を利用しています。

SSH で接続したリモートのシェル ( tcsh )上で、該当するファイルを確認するために、まずは、コマンド「 ls 」を実行します。



$ ls -l UPFILE/
total 4
-rw-r--r-- 1 www group_name 128 M月 D hh:mm up_file.txt



ディレクトリ UPFILE/ 直下に、当該ファイル「 up_file.txt 」の存在が確認出来ます。

次に、ファイルのデータが正常にアップロードされているかを確認します。

僕が利用しているレンタルサーバ Drive Network では、日本語編集用のエディタとして「 jvim 」が採用されていますが、このファイルをそのまま開くと文字化けが発生します。

なぜなら、Windows 上のテキストエディタで作成した当該ファイルは、文字コードが Shist-JIS になっているからです。

こういう場合は、次の様にオプション「 -k s 」を指定してファイルを開きます。オプション「 -k 」が文字コードを指定するという宣言で、「 s 」が文字コード Shift-JIS を意味します。


$ jvim -k s UPFILE/up_file.txt



ファイルの中身は次の様になっています。


1 CGI.pm を利用した
2 ファイルアップロードのための
3 Perl プログラムテスト用のファイル。
4
5 無事にアップロード出来るかを確認する。


Yes !


0x10a -> 0x10b へ



ファイルのアップロード処理は無事に完了しましたが、これで終わりではありません。

引き続き Cgi upload - perlmeme.org を参照しつつ、もう少し実用的なアップロード処理を確認します。


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