Perl Perl_2
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 ブラウザでの表示は既に確認した通り、次の様になります。

[ ファイルを選択 ] ボタンを押下すると、ローカルファイルの選択ウィンドウが開きます。今回は、アップロードのテスト用に次の内容を入力したファイル「 up_file.txt 」を用意しました。
CGI.pm を利用した
ファイルアップロードのための
Perl プログラムテスト用のファイル。
無事にアップロード出来るかを確認する。
これを選択し [ 開く ] ボタンを押下します。

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

[ 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 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)