現在1つのCGIで画像をアップロードさせる方法で困っています。
CGIの構成は以下の様になっていて、モードにより各ルーチンに飛ばす方法です。
-----------------------------------------------------------------
#!/usr/local/bin/perl
# フォームデータ取得
form_data();
# 各ページ出力
if ( $mode eq "up" ) { up(); }
html();
──────────────────────
sub form_data
{
# フォームデータ取得
if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
$query = $ENV{'QUERY_STRING'};
}
# フォームデータ復元
foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);
# 文字のデコード
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
}
$mode = $FORM{'mode'}; #モード
}
──────────────────────
sub up
{
use CGI;
$query = new CGI;
$filename = $query->param('File');
while(read($filename, $buffer, 2048))
{
$file .= $buffer;
}
@files = split(/\\/, $filename);
($basename, $exp) = split(/\./, $files[-1]);
$new_file = $basename . "." . $exp;
# ファイルを指定ディレクトリにコピー
open(OUT, "> ./$new_file");
binmode(OUT);
print(OUT $file);
close(OUT);
print "Content-type: text/html\n\n";
print "[$basename] [$exp]\n";
print "正常終了\n";
exit;
}
──────────────────────
sub html
{
print"Content-type: text/html\n\n";
print <<HTML;
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>アップロード</TITLE>
</HEAD>
<BODY>
<FORM method="post" action="i.cgi" enctype="multipart/form-data">
<INPUT type ="hidden" name="mode" value="up">
<INPUT size="40" type="file" name="File">
<INPUT type="submit" value="送信する">
</FORM>
</BODY>
</HTML>
HTML
}
-----------------------------------------------------------------
フォームメソッドがgetの時は、正常終了の表示が出るのですが、
アップロードされた画像が0バイトになり、
フォームメソッドがpostの場合はsub upのルーチンが実行されないようで、
画像はアップロードされず、フォーム入力の画面になってしまいます。
フォーム入力画面をCGIではなく、HTMLにし、CGIには画像アップロード
のプログラム飲みを書いた場合、メソッドをpostにすれば
正常にアップロードできるのですが
この様に1つのCGIにまとめる場合、どうすればいいのでしょうか?
宜しくお願い致します。