digital hole

Software developing and otherwise.

Flower

Archive for the ‘Perl’ Category

シンプルな画像アップロード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";

最もシンプル(?)な画像出力CGI

ただ既存の画像を無加工で吐き出すだけ。

#!/uer/local/bin/perl

open(IN,"a.jpg");
binmode IN;
binmode STDOUT;

print "Content-type: image/jpg\r\n\r\n";
while(my $n = read(IN, my $buf, 1024)){
  print $buf;
}

close(IN);