CGI WEB [ CGI配布 CGI解説 ホームページ作成支援 ]
ホーム|CGI配布|CGIランキング|CGIサポート|CGI解説|ワンタッチボード|ワンタッチメール|クイズ|自宅サーバ|サーバガイド|登録太郎|CGI WEBサーチ|CGI WEB窓口


back
cgi-lib.plの利用





cgi-lib.plを利用したファイルのアップロード方法について解説します。

■フォームの表示
ファイルをアップロードする為のフォームのタグ例です。

<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 補足を追加




CGI WEB