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


back
CGI.pmの利用





CGI.pmとはPerlに標準で組み込まれたモジュールの一種です。 このモジュールを利用する事でフォームデータの受け取りやファイルのアップロードを手軽に行う事が可能になります。 これらはcgi-lib.plを利用しても可能ですが、ファイルのアップロードサイズの上限値が128Kバイトである事や処理速度などの面から考えるとCGI.pmを利用するメリットは大きなものです。 この他にもCGI.pmを利用してHTMLの生成やクッキーの制御などを行う事が出来ますが、ここではフォームデータの受け取りとファイルのアップロードの方法を解説します。

■フォームの表示

<form action="./sample.cgi" method="post" enctype="multipart/form-data">
 <input type="file" name="upfile" />
 <input type="submit" value="送信" />
</form>

ファイルをアップロードするフォームのパラメータ名をupfileとしています。 ファイルをアップロードする場合はenctype属性を上記のように指定します。 また、必ずPOSTメソッドでデータを送信します。

■フォームデータの受け取り

require './jcode.pl';
use CGI qw(:standard);

my(@query) = param(); # 全てのパラメータ名取得

foreach (@query) {
  if ($_ ne 'upfile') {
    $val = param($_);
    &jcode'convert(*val, 'sjis');
    $buf{$_} = $val;
  }
}

use文を使用してCGI.pmの利用を宣言します。

use CGI ':standard';

と記述してもOKです。 次にparam関数を使用して、送信されたパラメータ名(フォームのname属性に指定された名前)を取得します。 例のようにparam()と指定すると全てのパラメータ名を取得する事が可能です。

次にアップロードファイル以外のデータの文字コード変換を行います。 このようにparam関数にパラメータ名を指定すると、指定したパラメータ名に対する値を取得する事が可能です。

■アップロード処理

sub upfile {
$file_h = upload('upfile'); # ファイルハンドル取得
$mime_t = uploadInfo($file_h)->{'Content-Type'}; # MIMEタイプ取得

# アップロードサイズ制限
if ((stat($file_h))[7] > 300 * 1024) { &error('ファイルサイズエラー'); }

# ファイル形式取得
$ext = '';
if  ($mime_t =~ /image\/.*jpe?g/i)    { $ext = '.jpg'; } # JPEG
elsif ($mime_t =~ /image\/.*gif/i)     { $ext = '.gif'; } # GIF
elsif ($mime_t =~ /image\/.*png/i)     { $ext = '.png'; } # PNG
elsif ($mime_t =~ /.*photoshop/i)      { $ext = '.psd'; } # フォトショップ
elsif ($mime_t =~ /text\/.*plain/i)     { $ext = '.txt'; } # TXT
elsif ($mime_t =~ /application\/.*pdf/i)  { $ext = '.pdf'; } # PDF
elsif ($mime_t =~ /application\/.*msword/i) { $ext = '.doc'; } # ワード
elsif ($mime_t =~ /application\/.*excel/i) { $ext = '.xls'; } # エクセル
elsif ($mime_t =~ /application\/.*zip/i)  { $ext = '.zip'; } # ZIP
elsif ($mime_t =~ /application\/.*flash/i) { $ext = '.swf'; } # FLASH
elsif ($mime_t =~ /video\/.*avi/i || $mime_t =~ /video\/.*msvideo/i)
                      { $ext = '.avi'; } # AVI
elsif ($mime_t =~ /video\/.*mpe?g/i)    { $ext = '.mpg'; } # MPEG
elsif ($mime_t =~ /video\/.*wmv/i)     { $ext = '.wmv'; } # WMV
elsif ($mime_t =~ /audio\/.*mp3/i || $mime_t =~ /audio\/.*mpe?g/i)
                      { $ext = '.mp3'; } # MP3
elsif ($mime_t =~ /audio\/.*mid/i)     { $ext = '.mid'; } # MIDI
elsif ($mime_t =~ /audio\/.*wma/i)     { $ext = '.wma'; } # WMA
elsif ($mime_t =~ /audio\/.*wav/i)     { $ext = '.wav'; } # WAVE
elsif ($mime_t =~ /audio\/.*realaudio/i)  { $ext = '.ram'; } # RealAudio

unless ($ext) { &error('アップロード出来ないファイル形式です。'); }

# ファイルアップロード
$upfilename = "./imagedir/upfile$ext";
open(OUT, ">$upfilename") || &error('アップロードエラー');
binmode(OUT);
while (read($file_h, $buf, 1024)) { print OUT $buf; }
close(OUT);
close($file_h);
chmod(0666, "$upfilename");
}

upload関数はファイルのアップロードの為に用意された関数です。 これを利用してパラメータ名upfileのファイルハンドルを取得します。 このファイルハンドルを利用して、このファイルのMIMEタイプを取得します。 MIMEタイプの取得はuploadInfo関数の引数にContent-Typeを指定します。

ファイルサイズの取得は例のようにstat関数を使用すると良いでしょう。 ここでは300Kバイト以下のファイルを受理するようにしています。

次にMIMEタイプを解析し、拡張子を設定します。 ここでは18種類のファイルについてMIMEタイプの解析例を挙げています。

実際にサーバにファイルがアップロードされるのはread関数で1024バイト毎にバイナリデータを$bufに読み込み、print関数で書き出している部分です。 最後にアップロードされたファイルのパーミッション値を設定しています。



□更新履歴
 2007.10.22 MIMEタイプ全般の解析方法変更
 2007.08.21 MP3ファイルの解析方法変更
 2007.04.27 全体的に内容を見直し
 2006.11.06 新規公開




CGI WEB