■フォームの表示
ファイルをアップロードする為のフォームのタグ例です。
|
|
<form action="./sample.cgi" method="post" enctype="multipart/form-data">
<input type="file" name="upfile" />
<input type="submit" value="送信" />
</form>
送信ボタンを押すとsample.cgiにデータを送信します。
ファイルをアップロードする場合はenctype属性を上記のように指定します。
また、必ずPOSTメソッドでデータを送信します。
|
|
■デコード処理
送信されたデータをcgi-lib.plを使用してデコード処理を行います。
|
|
require './jcode.pl';
require './cgi-lib.pl';
&ReadParse;
while (($name, $val) = each %in) {
if ($name ne 'upfile') { &jcode'convert(*val, 'sjis'); }
$buf{$name} = $val;
}
デコード処理については既に解説済みです。
デコード処理のトピックスを参照して下さい。
なお、cgi-lib.plで処理出来るデータサイズの上限は131,072バイト(128Kバイト)です。
|
|
■アップロード処理
上記のデコード処理を終えると$buf{'upfile'}には送信されたファイルのバイナリデータが格納されています。
これを保存するディレクトリに書き込むとファイルのアップロードが完了します。
その為には$buf{'upfile'}に格納されているバイナリデータのファイル形式(MIMEタイプ)を取得する必要があります。
cgi-lib.plでデコード処理を行うと@inに、送信された全てのパラメータ名やMIMEタイプが格納される事になっています。
この@inを利用してMIMEタイプを解析し、拡張子を設定してアップロード処理を行います。
ここでは10種類のファイルについてMIMEタイプの解析例を挙げています。
|
|
sub upfile {
# ファイルサイズが100Kバイトより大きければエラーとする
if (length($buf{'upfile'}) > 102400) { &error('ファイルサイズエラー'); }
# ファイル形式取得
$end = '';
foreach (@in) {
if ($_ =~ /name="upfile"/i) {
if ($_ =~ /image\/.*jpe?g/i) { $end = '.jpg'; last; }
if ($_ =~ /image\/.*gif/i) { $end = '.gif'; last; }
if ($_ =~ /image\/.*png/i) { $end = '.png'; last; }
if ($_ =~ /audio\/.*mid/i) { $end = '.mid'; last; }
if ($_ =~ /text\/.*plain/i) { $end = '.txt'; last; }
if ($_ =~ /application\/.*msword/i) { $end = '.doc'; last; }
if ($_ =~ /application\/.*excel/i) { $end = '.xls'; last; }
if ($_ =~ /application\/.*zip/i) { $end = '.zip'; last; }
if ($_ =~ /application\/.*flash/i) { $end = '.swf'; last; }
if ($_ =~ /application\/.*pdf/i) { $end = '.pdf'; last; }
}
}
# 上記以外のファイルはアップロード出来ないようにする
unless ($end) { &error('アップロード出来ないファイル形式です。'); }
# アップロード処理
$upfilename = "./imagedir/upfile$end";
open(OUT, ">$upfilename") || &error('アップロードエラー');
binmode(OUT); # 出力をバイナリモードに切り替える
print OUT $buf{'upfile'}; # バイナリデータの書き込み
close(OUT);
chmod(0666, $upfilename); # パーミッション値の変更
}
|
|
|
例えば「sample.jpg」ファイルを送信した場合、この処理を終えると「imagedir」ディレクトリ下に「upfile.jpg」ファイルとしてアップロードされます。
chmod関数はUNIXサーバへのアップロードを考慮してパーミッション値の変更を行います。
アップロードしたファイルのパーミッション値は666とするのが妥当だと思います。
|
|
■補足
cgi-lib.plを利用したファイルのアップロード方法では128Kバイトを超えるファイルのアップロードが出来ません。
大容量ファイルのアップロードが必要な場合はCGI.pmモジュールを利用する方法が一般的です。
CGI.pmの利用方法は以降の項目で解説します。
|
|
|
ファイルのアップロードの他にcgi-lib.plを使用する事により、以下のようなフォームからの送信データに対する処理を簡単に行う事が出来ます。
|
|
<select name="formdata" multiple>
<option value="no1" selected="selected">S30</option>
<option value="no2" selected="selected">130</option>
<option value="no3">z31</option>
</select>
multiple指定なので複数の項目を選択する事が可能です。
|
|
<input type="checkbox" name="formdata" value="no1" checked="checked" />S30
<input type="checkbox" name="formdata" value="no2" checked="checked" />130
<input type="checkbox" name="formdata" value="no3" />z31
こちらも複数の項目を選択する事が可能です。
|
|
|
これらのフォームから複数の項目が送信された場合、通常のデコード処理では送信されたデータは上書きされ、1つの選択項目しか受け取る事は出来ません。
cgi-lib.plを使用してデコード処理を行うと、例えば「no1\0no2」というように\0(ヌルコード)で連結した形で選択項目を受け取る事が出来るようになります。
|
|
□更新履歴
2007.10.22 MIMEタイプ全般の解析方法変更
2007.04.27 全体的に内容を見直し
2006.11.06 補足を追加
|
|
|