CGI中如何才能避免在文件没上传成功前产生CGItemp*****文件?

CGI中如何才能避免在文件没上传成功前产生CGItemp*****文件?

如题

example:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
#upload file

use strict;
use  CGI;

sub up
{
print  "Content-type:  text/html\n\n";
my $ggg = new CGI;
my $rand=$ggg->;param('randnum');
my $rand2=$ggg->;param('randnum2');
if($rand==$rand2)
{&}
else
{
print "验证码错误!";
exit;
}
}

sub upload {
my $message;
my $upfilecount  =  1;
my $maxuploadcount  =  1;  #限制上传文件的最大数
my $basedir  =  "";  #上传的文件存放地址
my $allowall  =  "no";  #是否不限制文件后缀上传
my @theext  =(".mp3");  #没有被限制的文件后缀名

while  ($upfilecount  <=  $maxuploadcount)  {
my  $req  =  new  CGI;
my  $file  =  $req->;param("FILE$upfilecount");
my  $info = $req->;param('info');
if  ($file  ne  "")  {
my  $fileName  =  $file;
$fileName  =~  s/^.*(\\|\/)//;  #用正则表达式去除无用的路径名,得到文件名
my  $newmain  =  $fileName;
my  $filenotgood;
if  ($allowall  ne  "yes")  {
my $extname  =  lc(substr($newmain,length($newmain)  -  4,4));  #取后缀名
for(my  $i  =  0;  $i  <  @theext;  $i++){  #这段进行后缀名检测
if  ($extname  ne  $theext[$i]){
$filenotgood  =  "yes";
last;
}
}
}
if  ($filenotgood  ne  "yes")  {  #这段开始上传
open  (OUTFILE,  ">;$basedir/$fileName");
binmode(OUTFILE);  #务必全用二进制方式,这样就可以放心上传二进制文件了。而且文本文件也不会受干扰
while  (my  $bytesread  =  read($file,  my  $buffer,  1024))  {
print  OUTFILE  $buffer;
}
close  (OUTFILE);
open(FILE1,">;>;upload.info");
print FILE1 "$fileName"."!"."$info\n";
close(FILE1);
$message.=$file  .  "  已成功上传!<br>;<a href=upload.cgi>;返回</a>;<br>;\n";
}
else{
$message.=$file  .  "  文件后缀不符合要求,上传失败!<br>;<a href=upload.cgi>;返回</a>;<br>;\n";
}
}
$upfilecount++;
}

print  $message;  #最后输出上传信息
}

sub main {
my $out;
open(FILE,"<upload.info");
my @line=<FILE>;;
close(FILE);
chomp(@line);

my $randnumber=int(rand(9999));

foreach (@line){
my($filename,$fileinfo)=split(/!/,$_);
$out.="<a href=http://www.host.com/$filename>;$filename</a>; <font color=red>;说明:$fileinfo</font>;<br>;";
}

print  "Content-type:  text/html\n\n";
print qq~<html>;
已上传文件:<br>;$out
<form method="POST" action="upload.cgi?up" ENCTYPE="multipart/form-data">;
File:
<input type="file"  name="FILE1">;<br>;
文件说明:<input type=text name=info>;
<br>;
请输入验证码:<input type="text" name="randnum" size=5>; $randnumber
<input type=hidden name=randnum2 value=$randnumber>;
<br>;
<br>;
注意:文件名不要有空格,也不要是中文字符,不然会出错...<br>;<input  type="submit"  value="Upload!">;
</form>;
</html>;~
}

my $action=$ENV{'QUERY_STRING'};
if($action eq "up"){&}
else{&}

如何才能在判断所输验证码正确后才产生CGItemp*****文件?
你是在win系统下跑的吗?

我没看你代码。不过我也遇到过产生CGITemp的这个问题。

我当时原因找到了,是因为我建立了两个文件的对象或Handle什么的。实际上我只存储了一个,另外一个就是CGITemp了。

我当时解决方法是,我自己写了一个POST解码。就OK了。
是在WIN下跑的

谢谢,我去试试POST解码
不过还有其他办法吗?多几种选择会更灵活点
支持上载的POST编码自己写起来有些麻烦。
谁有就贴一个过来吧。

我的代码放在家里了。
我也是在win2k下用的,不知如何才能在上传成功后删除cgitemp文件,请指点,不胜感激。
希望下面这个对你有用





############### 处理表单
sub MANAGE_URL_LENGTH{


my (@pairs,$pair,$name,$line,$value,$boundary,$buffer,$real_file,@column,$dump);

        if($ENV{'QUERY_STRING'}) {
                        @pairs = split(/&/,$ENV{'QUERY_STRING'});
                        foreach $pair (@pairs) {
                                ($name, $value) = split(/=/,$pair);
                                $value =~ tr/+/ /;
                                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
                                $FORM{$name} = $value;
                        }
                       
                       
                       
                       
        }else{
                        binmode STDIN;
                        read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
                       
                        ($boundary=$ENV{'CONTENT_TYPE'}) =~ s/^.*boundary=(.*)$/$1/;
                        @pairs=split(/--$boundary/, $buffer);
                       
                        for $pair (@pairs)  {
                                ($dump,$line,$value) = split(/\r\n/,$pair,3);
                                if($line =~ /filename/) {
                                        $real_file = $line;
                                }
                                next if $line =~ /filename=\"\"/;
                                $line =~ s/^Content-Disposition: form-data; //;
                                (@column) = split(/;\s+/, $line);
                                ($name = $column[0]) =~ s/^name="([^"]+)"$/$1/g;
                               
                                if($#column >; 0) {
                                        ($dump,$dump,$value) = split(/\r\n/,$value,3);
                                }else {
                                        ($dump,$value) = split(/\r\n/,$value,2);
                                        next if $value =~ /^\s*$/;
                                        $FORM{$name} = $value;
                                        chop($FORM{$name});
                                        chop($FORM{$name});
                                        next;
                                }
                               
                                $FORM{$name} = $value;
                        }
        }
       
##return %FORM;

}##FILEDATA
这个帖子好象有点早了
我每次都要将上传的句柄关闭了-----        close(句柄);
这样不会产生CGITEMP