digital hole

Software developing and otherwise.

Flower

シンプルな画像アップロードCGI

cgi-lib.pl を使う場合。

問答無用で全POSTデータを読み込むので、場合によっては効率が悪い。その分コードは美しい(まさに必要な文脈だけを伝えている)。

img_up.pl

#!perl

# cgi-lib.plを使う場合

require "cgi-lib.pl";
$cgi_lib::maxdata = 500000; #必要であれば上限値変更

print "Content-type: text/html; charset=Shift_JIS;\n\n";
print "<html><body>\n";

if($ENV{REQUEST_METHOD} ne 'POST'){
    # フォーム
    print '<form action="img_up.pl" enctype="multipart/form-data" method="POST">';
    print '<input type="file" name="img" size="50">';
    print '<input type="submit" value="送信">';
    print '</form>';
}
else{
    # パラメータ読み取り
    ReadParse(*IN);
   
    # 書き出し
    open(OUT,">test.jpg");
    binmode OUT;
    print OUT $IN{'img'};
    close(OUT);
   
    # 結果
    print 'アップしました。<br><img src="test.jpg">';
}

print "\n</body></html>\n";

CGI.pmを使う場合

必要なときだけ読み込み処理を行えるので、柔軟性がある。

img_up2.pl

#!perl

# CGI.pm を使う場合

use CGI;

print "Content-type: text/html; charset=Shift_JIS;\n\n";
print "<html><body>\n";

if($ENV{REQUEST_METHOD} ne 'POST'){
    # フォーム
    print '<form action="img_up2.pl" enctype="multipart/form-data" method="POST">';
    print '<input type="file" name="img" size="50">';
    print '<input type="submit" value="送信">';
    print '</form>';
}
else{
    # パラメータ読み取り
    my $q = new CGI;
   
    # 読み取り -> $data
    my $file = $q->param('img');
    my $data;
    while(read($file, my $tmp, 1024)){
        $data .= $tmp;
    }
   
    # 書き出し
    open(OUT,">test2.jpg");
    binmode OUT;
    print OUT $data;
    close(OUT);
   
    # 結果
    print "file = $file<br>";
    print 'アップしました。<br><img src="test2.jpg">';
}

print "\n</body></html>\n";

One Response to “シンプルな画像アップロードCGI”

  1. 8 月 26th, 2009 at 16:45

    oqutusy says:

Leave a Reply