画像複数アップロード

画像を複数アップロードするプログラムです。ライブラリは使っていません。
いっしょに他のフォームデータも取得できます。

サンプル入力フォーム

フィールドの順番はテキストフィールドからでも、ファイルフィールドからでもどちらでも大丈夫です。
ソースはこちら
ポイントは赤で書いてあるところです。

<form enctype="multipart/form-data" method="post" action="ファイルアップCGI">
enctype="multipart/form-data" これを必ず。
action にはファイルアップロードのCGIを指定

<input type="file" name="filedata0">
<input type="file" name="filedata1">
<input type="file" name="filedata2">
ファイルフィールドですが、name属性をfiledata0,filedata1のように
「filedata連番(0から)」にしてください。連番であればファイルフィールドはいくつも持てます。

それでは画像アップロードCGIです。


#!/usr/bin/perl

if($ENV{'REQUEST_METHOD'} eq "POST") {&fileget;}
 
&input;
 
sub fileget{
 
if($ENV{'CONTENT_LENGTH'} < 500000000){ #ここで最大サイズ調整
 $i=0;
 while(<STDIN>){
  if(/^\r\n/){next;}
  if(/^--/){
   if($flag == 1){
    chop $data;
    chop $data;
    print OUT $data;
    close(OUT);
    $data = "";
    $flag = 0;
   }
   $bound = $_;
   $bound =~ s/\r\n//;
   $flag = 0;
   next;
  }
 
  if((/^Content-Disposition/) && (/filename/)){
   ($fname, $dummy) = split(/\n/, $_);
   $fname =~ s/Content-Disposition: form-data; name=\"filedata$i\"; filename=\"(.*)\"(.*)/$1/i;
   $fname =~ s/\\/\//g; $fname =~ s/([^ ]*)\/([^ ]*)$/$2/;
   $img_name[$i] = $fname;
   $i++;
   next;
 
  }else{
   if(/^Content-Disposition/){
    $name = $_;
    $name =~ s/Content-Disposition: form-data; name="(.*)"(.*)$/$1/i;
    chop $name;
    $text_flag = 1;
    next;
   }
  }
  if($text_flag == 1){
   if($name ne ""){
     $FORM{"$name"} .= $_;
     $FORM{"$name"} =~ s/\r\n//;
     $FORM{"$name"} =~ s/</&lt;/g;
     $FORM{"$name"} =~ s/>/&gt;/g;
   }
   $text_flag = 0;
   next;
  }
 
  if(/^Content-Type/){next;}
 
  if($flag == 0){
   if($fname =~ /Submit/){last;}
 
   open(OUT, ">./img/$fname"); #画像保存場所指定
   $flag = 1;
  }
  if($flag == 1){$data .= $_;}
 
 }
 
}
}
 
sub input{
 #フォームを取得した後のの処理
}
 

sub fileget が今回メインのルーチンです。

上記のプログラムではimgというディレクトリに画像を保存するようになっています。
imgには書き込み許可の属性がついていなければいけません。
保存する際に、同じファイル名であれば上書きしています。

画像ファイル名は $img_name[$i] で取得できます。
その他の入力フォームは $FORM{"$name"} で取得できます。
ただ、見た感じ、上のプログラムでは、マルチラインのテキストフィールド(こんなん↓)

は、一緒に取得できないと思います。

sub input
 はフォームの値を取得した後の処理です。