http://www.perlmonks.org?node_id=1015685

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

for small files this scipt is working fine, but for larger files , its showing as success but the result is a file of 0 bytes.please help to solve this .

#!/usr/bin/perl -wT + + + + use strict; + + use CGI; + + use CGI::Carp qw ( fatalsToBrowser ); + + use File::Basename; + + + + $CGI::POST_MAX = 1024 * 70000; + + my $safe_filename_characters = "a-zA-Z0-9_.-"; + + my $upload_dir = "/var/www/mnt"; + + + + my $query = new CGI; + + my $filename = $query->param("photo"); + + my $email_address = $query->param("email_address"); + + + + if ( !$filename ) + + { + + print $query->header ( ); + + print "There was a problem uploading your photo (try a smaller file). +"; + 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("photo"); + + + + open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!"; + + binmode UPLOADFILE; + + + + while ( <$upload_filehandle> ) + + { + + print UPLOADFILE; + + } + + + + close UPLOADFILE; print $query->header ( ); + + print "<html>"; + + print "<head>"; + + + + print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset +=utf-8\" />"; + print "<title>Thanks!</title>"; + + print "<style type=\"text/css\">"; + + print 'img {border: none;}'; + + print "</style>"; + + + + print "<body> + + <p>Thanks for uploading your photo!</p> + + <p>Your email address: $email_address</p> + + <p>Your photo:</p> + + <p><img src=\"../mnt/$filename\" alt=\"Photo\" /></p> + + </body> + + </head> + + + + </html>";

Replies are listed 'Best First'.
Re: perl cgi scipt to upload files
by Corion (Patriarch) on Jan 28, 2013 at 11:46 UTC
    $CGI::POST_MAX = 1024 * 70000;

    What does the CGI documentation say about this line and what steps have you undertaken to verify that? Could the documentation be made clearer? Are you certain that you get "success" as answer?

Re: perl cgi scipt to upload files
by vinoth.ree (Monsignor) on Jan 28, 2013 at 12:02 UTC

    From CGI.pm An attempt to send a POST larger than $POST_MAX bytes will cause param() to return an empty CGI parameter list. You can test for this event by checking cgi_error(), either after you create the CGI object or, if you are using the function-oriented interface, call <param()> for the first time. If the POST was intercepted, then cgi_error() will return the message "413 POST too large".