upload.cgi
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:5k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. #!/usr/bin/perl
  2. # PHP File Uploader with progress bar Version 1.43
  3. # Copyright (C) Raditha Dissanyake 2003
  4. # http://www.raditha.com
  5. # Licence:
  6. # The contents of this file are subject to the Mozilla Public
  7. # License Version 1.1 (the "License"); you may not use this file
  8. # except in compliance with the License. You may obtain a copy of
  9. # the License at http://www.mozilla.org/MPL/
  10. # Software distributed under this License is distributed on an "AS
  11. # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  12. # implied. See the License for the specific language governing
  13. # rights and limitations under the License.
  14. # The Initial Developer of the Original Code is Raditha Dissanayake.
  15. # Portions created by Raditha are Copyright (C) 2003
  16. # Raditha Dissanayake. All Rights Reserved.
  17. # CHANGES:
  18. # As of version 1.00 cookies were abolished!
  19. # as of version 1.02 stdin is no longer set to non blocking.
  20. # 1.40 - POST is no longer required and processing is more efficient.
  21. # Please refer online docs  for details.
  22. # 1.42 - The temporary locations were changed, to make it easier to
  23. # clean up afterwards.
  24. use CGI;
  25. use Fcntl qw(:DEFAULT :flock);
  26. use File::Temp qw/ tempfile tempdir /;
  27. #use Carp;
  28. @qstring=split(/&/,$ENV{'QUERY_STRING'});
  29. @p1 = split(/=/,$qstring[0]);
  30. $sessionid = $p1[1];
  31. $sessionid =~ s/[^a-zA-Z0-9]//g;  # sanitized as suggested by Terrence Johnson.
  32. @p1 = split(/=/,$qstring[1]);
  33. $php_uploader = $p1[1];
  34. require("./header.cgi");
  35. #carp "$post_data_file and $monitor_file";
  36. $content_type = $ENV{'CONTENT_TYPE'};
  37. $len = $ENV{'CONTENT_LENGTH'};
  38. $bRead=0;
  39. $|=1;
  40. sub bye_bye {
  41. $mes = shift;
  42. print "Content-type: text/htmlnn";
  43. print "<br>$mes<br>n";
  44. exit;
  45. }
  46. #
  47. # The thing to watch out for is file locking. Only
  48. # one thread may open a file for writing at any given time.
  49. if (-e "$post_data_file") {
  50. unlink("$post_data_file");
  51. }
  52. if (-e "$monitor_file") {
  53. unlink("$monitor_file");
  54. }
  55. sysopen(FH, $monitor_file, O_RDWR | O_CREAT, 0x777)
  56. or die "can't open numfile: $!";
  57. # autoflush FH
  58. $ofh = select(FH); $| = 1; select ($ofh);
  59. flock(FH, LOCK_EX)
  60. or die "can't write-lock numfile: $!";
  61. seek(FH, 0, 0)
  62. or die "can't rewind numfile : $!";
  63. print FH $len;
  64. close(FH);
  65. sleep(1);
  66. open(TMP,">","$post_data_file") or &bye_bye ("can't open temp file");
  67. #
  68. # read and store the raw post data on a temporary file so that we can
  69. # pass it though to a CGI instance later on.
  70. #
  71. my $i=0;
  72. $ofh = select(TMP); $| = 1; select ($ofh);
  73. while (read (STDIN ,$LINE, 32768) && $bRead < $len )
  74. {
  75. $bRead += length $LINE;
  76. select(undef, undef, undef,0.01); # sleep for 0.35 of a second.
  77. # Many thanx to Patrick Knoell who came up with the optimized value for
  78. # the duration of the sleep
  79. $i++;
  80. print TMP $LINE;
  81. }
  82. close (TMP);
  83. #
  84. # We don't want to decode the post data ourselves. That's like
  85. # reinventing the wheel. If we handle the post data with the perl
  86. # CGI module that means the PHP script does not get access to the
  87. # files, but there is a way around this.
  88. #
  89. # We can ask the CGI module to save the files, then we can pass
  90. # these filenames to the PHP script. In other words instead of
  91. # giving the raw post data (which contains the 'bodies' of the
  92. # files), we just send a list of file names.
  93. #
  94. #print "nn";
  95. open(STDIN,"$post_data_file") or die "can't open temp file";
  96. # chmod the file so everyone can read it
  97. # added by Ben Lancaster (benlanc@ster.me.uk)
  98. chmod (0666, $post_data_file);
  99. my $cg = new CGI();
  100. my $qstring="?";
  101. my %vars = $cg->Vars;
  102. my $j=0;
  103. while(($key,$value) = each %vars)
  104. {
  105.  
  106. $file_upload = $cg->param($key);
  107. if(defined $value && $value ne '')
  108. {
  109. my $fh = $cg->upload($key);
  110. #print "::".$key."::".$fh."::n";
  111. if(defined $fh)
  112. {
  113. #carp $fh;
  114. ($tmp_fh, $tmp_filename) = tempfile();
  115. # chmod the file so everyone can read it
  116. # added by Ben Lancaster (benlanc@ster.me.uk)
  117. chmod (0666, $tmp_filename);
  118. while(<$fh>) {
  119. print $tmp_fh $_;
  120. }
  121. close($tmp_fh);
  122. $fsize =(-s $fh);
  123. $fh =~ s/([^a-zA-Z0-9_-.])/uc sprintf("%%%02x",ord($1))/eg;
  124. $tmp_filename =~ s/([^a-zA-Z0-9_-.])/uc sprintf("%%%02x",ord($1))/eg;
  125. $qstring .= "file[$key][name]=$fh&file[$key][size]=$fsize&";
  126. $qstring .= "file[$key][tmp_name]=$tmp_filename&";
  127. $j++;
  128. }
  129. else
  130. {
  131. $value =~ s/([^a-zA-Z0-9_-.])/uc sprintf("%%%02x",ord($1))/eg;
  132. $qstring .= "$key=$value&" ;
  133. }
  134. }
  135. }
  136. my $url = $php_uploader . $qstring . "&" . $ENV{'QUERY_STRING'};
  137. open (SIGNAL,">", $signal_file);
  138. print SIGNAL "n";
  139. close (SIGNAL);
  140. print "Location: $urlnn";