rishford has asked for the wisdom of the Perl Monks concerning the following question:

Hi All, I am in the process of the coding the following to upload a file using the file input in HTML. A file is created in the appropriate directory and with the correct name but it is empty. I have checked the form includes the encypt=multipart/form-data flag so I'm stumped as to why this is still happening. Ok here is the HTML:
<form name="form2" method="post" action="/cgi-bin/selecttestenv.pl" en +ctype="multipart/form-data"> Please specify the test pack <p>DAP:<br /> <input type "text" name="dap" value= "" size="31" > </font></p> <p>Tick File:<br /> <input type="file" name="tick" size="chars"></p> <p><i>Tick File DTD:</i></br> <input type="file" name="tickdtd" size="chars"></p> <p><i>Fx Rates:</i></br> <input type="file" name="fxrates" size="chars"></p> <p><i>Fx Rates DTD:</i></br> <input type="file" name="fxdtd" size="chars"></p> <p>Excel File:<br /> <input type="file" name="excel" size="chars"></p> </font></p> <p> <input type="submit" name="form2" value="Next"></p> </form>
And here is the perl script - cgi-bin/selecttestenv.pl:
$CGI::POST_MAX = 1024 * 5000; my $safe_filename_characters = "a-zA-Z0-9_.-"; my $upload_dir = $dir; print $upload_dir; my $query = new CGI; my $filename = $query->param('tick'); print "my $filename = $query->param($tick); "; if ( !$filename ) { print $query->header ( ); #print "\r\n"; print "There was a problem uploading your testpack (try a smaller fil +e)."; exit; } my ( $name, $path, $extension ) = fileparse ( $filename, '\..*' ); $filename = $name . $extension; $filename =~ tr/ /_/; $filename =~ s/[^$safe_filename_characters]//g; if ( $filename =~ /^([$safe_filename_characters]+)$/ ) { $filename = $1; } else { die "Filename contains invalid characters"; } my $upload_filehandle = $query->upload('$filename'); #print "U:" . "$upload_dir" . "\r\n"; #print "F:" . "$filename" . "\r\n"; #print "UF:" . ">$upload_dir/$filename" . "\r\n"; print "open ( UPLOADFILE, '>$upload_dir/ticks.xml' )"; open ( UPLOADFILE, ">$upload_dir/ticks.xml" ) or die "$!"; binmode UPLOADFILE; while ( <$upload_filehandle> ) { print UPLOADFILE; } close UPLOADFILE; print $query->header ( );

Replies are listed 'Best First'.
Re: Trying to write an appropriate file upload script
by lostjimmy (Chaplain) on Jan 25, 2010 at 19:18 UTC
    It looks like your main problem is in retrieving the file handle. The documentation for CGI states that the upload method takes the name of the field, not the name of the file. You should also check to make sure that it is defined after retrieving it. From the docs (I do believe that upgrading to a true IO::Handle is optional, but couldn't hurt):
    $lightweight_fh = $q->upload('field_name'); # undef may be returned if it's not a valid file handle if (defined $lightweight_fh) { # Upgrade the handle to one compatible with IO::Handle: my $io_handle = $lightweight_fh->handle; open (OUTFILE,">>/usr/local/web/users/feedback"); while ($bytesread = $io_handle->read($buffer,1024)) { print OUTFILE $buffer; } }