免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2998 | 回复: 6
打印 上一主题 下一主题

CGI中如何才能避免在文件没上传成功前产生CGItemp*****文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-19 22:48 |只看该作者 |倒序浏览
如题

example:


  1. #!/usr/bin/perl
  2. #upload file

  3. use strict;
  4. use  CGI;

  5. sub up
  6. {
  7. print  "Content-type:  text/html\n\n";
  8. my $ggg = new CGI;
  9. my $rand=$ggg->;param('randnum');
  10. my $rand2=$ggg->;param('randnum2');
  11. if($rand==$rand2)
  12. {&}
  13. else
  14. {
  15. print "验证码错误!";
  16. exit;
  17. }
  18. }

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

  26. while  ($upfilecount  <=  $maxuploadcount)  {
  27. my  $req  =  new  CGI;
  28. my  $file  =  $req->;param("FILE$upfilecount");
  29. my  $info = $req->;param('info');
  30. if  ($file  ne  "")  {
  31. my  $fileName  =  $file;
  32. $fileName  =~  s/^.*(\\|\/)//;  #用正则表达式去除无用的路径名,得到文件名
  33. my  $newmain  =  $fileName;
  34. my  $filenotgood;
  35. if  ($allowall  ne  "yes")  {
  36. my $extname  =  lc(substr($newmain,length($newmain)  -  4,4));  #取后缀名
  37. for(my  $i  =  0;  $i  <  @theext;  $i++){  #这段进行后缀名检测
  38. if  ($extname  ne  $theext[$i]){
  39. $filenotgood  =  "yes";
  40. last;
  41. }
  42. }
  43. }
  44. if  ($filenotgood  ne  "yes")  {  #这段开始上传
  45. open  (OUTFILE,  ">;$basedir/$fileName");
  46. binmode(OUTFILE);  #务必全用二进制方式,这样就可以放心上传二进制文件了。而且文本文件也不会受干扰
  47. while  (my  $bytesread  =  read($file,  my  $buffer,  1024))  {
  48. print  OUTFILE  $buffer;
  49. }
  50. close  (OUTFILE);
  51. open(FILE1,">;>;upload.info");
  52. print FILE1 "$fileName"."!"."$info\n";
  53. close(FILE1);
  54. $message.=$file  .  "  已成功上传!<br>;<a href=upload.cgi>;返回</a>;<br>;\n";
  55. }
  56. else{
  57. $message.=$file  .  "  文件后缀不符合要求,上传失败!<br>;<a href=upload.cgi>;返回</a>;<br>;\n";
  58. }
  59. }
  60. $upfilecount++;
  61. }

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

  64. sub main {
  65. my $out;
  66. open(FILE,"<upload.info");
  67. my @line=<FILE>;;
  68. close(FILE);
  69. chomp(@line);

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

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

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

  91. my $action=$ENV{'QUERY_STRING'};
  92. if($action eq "up"){&}
  93. else{&}
复制代码


如何才能在判断所输验证码正确后才产生CGItemp*****文件?

论坛徽章:
0
2 [报告]
发表于 2003-07-20 09:15 |只看该作者

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

你是在win系统下跑的吗?

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

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

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

论坛徽章:
0
3 [报告]
发表于 2003-07-20 12:51 |只看该作者

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

是在WIN下跑的

谢谢,我去试试POST解码
不过还有其他办法吗?多几种选择会更灵活点

论坛徽章:
0
4 [报告]
发表于 2003-07-23 10:26 |只看该作者

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

支持上载的POST编码自己写起来有些麻烦。
谁有就贴一个过来吧。

我的代码放在家里了。

论坛徽章:
0
5 [报告]
发表于 2003-09-25 16:20 |只看该作者

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

我也是在win2k下用的,不知如何才能在上传成功后删除cgitemp文件,请指点,不胜感激。

论坛徽章:
0
6 [报告]
发表于 2003-09-28 13:19 |只看该作者

CGI中如何才能避免在文件没上传成功前产生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

论坛徽章:
0
7 [报告]
发表于 2008-12-15 18:36 |只看该作者
这个帖子好象有点早了
我每次都要将上传的句柄关闭了-----        close(句柄);
这样不会产生CGITEMP
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP