|
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 新規公開
|
|
|