画像複数アップロード
画像を複数アップロードするプログラムです。ライブラリは使っていません。
いっしょに他のフォームデータも取得できます。
サンプル入力フォーム
フィールドの順番はテキストフィールドからでも、ファイルフィールドからでもどちらでも大丈夫です。
ソースは
こちら
ポイントは赤で書いてあるところです。
<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/</</g;
$FORM{"$name"} =~ s/>/>/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 はフォームの値を取得した後の処理です。