in reply to upload script

Might the file that is being uploaded by an image or an mp3 or some other binary file? If so your reading routing ought to look something more like this:
my $filehandle = $q->param('file'); my($buffer,$bytesread,$has_data); if( $cfg{filetype} eq 'binary' ) { open(OUTFILE,">$cfg{savename}") or return("Couldn't open '$cfg{savename}' for writing: $!" +); binmode OUTFILE; while ( $bytesread=read($original_name,$buffer,$cfg{max_bytes} +)) { print OUTFILE $buffer; $has_data++; } close OUTFILE or return("Couldn't close '$cfg{savename}': $!"); if(!defined $bytesread) { return("$!"); } } else { open(OUTFILE,">$cfg{savename}") or return("Couldn't open '$cfg{savename}' for writing: $!" +); while (<$original_name>) { print OUTFILE; $has_data++; } close OUTFILE or return("Couldn't close '$cfg{savename}': $!"); } if( !$has_data ) { return(qq/ Nothing in '$original_name'.<br> It either doesn't exist, or is empty.' /); } return '';
You should also have something like this unless you like DOS attacks:

$CGI::POST_MAX = $cfg{max_bytes};