#!/usr/bin/perl #use strict; #use POSIX 'SEEK_SET'; #use vars qw/ $uploadsFolder /; use Fcntl qw(:DEFAULT :flock); use File::Temp qw/ tempfile tempdir /; use CGI; my $path = $ENV{'PATH_TRANSLATED'} || ''; if($path eq ''){$path = $ENV{'SCRIPT_FILENAME'};} $path =~s/upload.pl/conf.uploader/; if($path eq ''){$path = "conf.uploader";} my $DEBUG = 0; print "Content-Type: text/plain\n\n"; warn "we required $path" if $DEBUG; require $path; my $content_type = $ENV{'CONTENT_TYPE'}; my $len = $ENV{'CONTENT_LENGTH'}; my $bRead = 0; my $sessionid; my $starttime = time; my @qstring=split(/&/,$ENV{'QUERY_STRING'}); $sessionid = $qstring[0]; if($sessionid eq 'test'){ print "ok"; exit; } my $tmpfile = "$uploadsFolder\\temp_$sessionid"; my $statsfile = "$uploadsFolder\\stats_$sessionid.txt"; my $tmpfilepre= "$uploadsFolder\\$sessionid\_"; $tmpfile =~s/\\/\//g; $statsfile =~s/\\/\//g; $tmpfilepre =~s/\\/\//g; open(TMP,"+>","$tmpfile") or die "can't open temp file $tmpfile: $!"; open(STATS,">","$statsfile") or die "can't open stats file $statsfile: $!"; my $rLen = 4096; my $LINE; # values for dl progression-small my ($now,$elapsed,$percent,$estimate,$estTime,$percentEst); if($len - $bRead < $rLen){ $rLen = $len-$bRead; } while ($bRead < $len && read (STDIN ,$LINE, $rLen)) { $bRead += length $LINE; if($len - $bRead < $rLen){ $rLen = $len-$bRead; } print TMP $LINE; $now = time; $elapsed = $now-$starttime; $percent = ($bRead/$len) * 100; if($elapsed >= 1){ $estimate = $bRead / $elapsed; # in kb }else{ $estimate = $bRead / .5; } $estTime = ($len-$bRead)/$estimate; #in sec $percentEst = $estimate/$len * 100; #in percent # % , % per second, kb estimate, est time remaining if($percent >= 99){ $percent = 99; } seek(STATS,0,SEEK_SET); print STATS "$percent\n$percentEst\n$estimate\n$estTime\n$len\n\n"; } if($bRead != $len){ close(TMP); unlink $tmpfile or warn "Failed to unlink $tmpfile: $!"; unlink $statsfile or warn "Failed to unlink $statsfile: $!"; exit; } my ($junk,$boundary); ($junk,$boundary) = split /=/, $ENV{CONTENT_TYPE}, 2; $boundary =~ s/\n//; $boundary = "--$boundary"; seek(TMP,0,SEEK_SET); my $i = 0; my $expect_junk = 0; my @fileCount; my ($filename,$line,$headers,$unwanted); LINE: while () { $line = $_; # If it's a boundary if (($line eq "$boundary\r\n") && ($fileCount[$i] eq '')){ close FILE; $i++; # register it's a new file print "got new filename" if $DEBUG; $fileCount[$i] = 'new'; next LINE; # find the new filename } elsif ($fileCount[$i] eq 'new'){ print "
suspect new filename on file ".$i if $DEBUG; ($headers,$unwanted) = split(/\n\r\n/,$line,2); ($headers,$unwanted) = split(/\n\r\n/,$line,2); $filename = $headers; $filename =~s/.*?\n?.+?filename=\"(.+(\\|\/))?(.+?)\".*\n.*/file-$3/g; if(substr($filename,0,5) eq "file-"){ $filename =~s/file-//; print "
filename was $filename" if $DEBUG; open(FILE,"+>","$tmpfilepre$filename") or warn "Can't open temp file: $tmpfilepre$filename: $!"; binmode(FILE); $fileCount[$i] = ''; } else { if ($DEBUG) {warn "something wrong\n"; print "
something is wrong"; } } } elsif ($expect_junk == 1) { $expect_junk = 0; next LINE; } else { if ($line =~ m/Content-Type/) { $expect_junk = 1; next LINE; } # Real file data here, write it. print FILE $line or die "Failed to write file: $!"; } } close FILE; close TMP; seek(STATS,0,SEEK_SET); print STATS "100\n$percentEst\n$estimate\n$estTime\n$len\n"; close STATS;