in reply to A Journey in Uploading

You pasted together some snippets of the CGI documentation, but all of those snippets are supposed to be used separately, not together. Personally, I would use the upload() variant:

my $original_name = param('uploaded_file'); my $fh = upload('uploaded_file'); binmode $fh; # just to be sure # "Untaint" the original name: $original_name =~ s/[^\w.]/_/g; my $outname = File::Spec->catfile( $private_dir, $original_name ); open my $outfile, '>', $outname or die "Couldn't create $outname: $!"; local $/ = \4096; # blocksize while (<$fh>) { print $outfile $_; }; warn "Uploaded a file into $outname";

Update: Corrected local $/ = \4096, as spotted by cdarke

Replies are listed 'Best First'.
Re^2: After Revieing the Cpan On CGI, wrt Uploading things
by cdarke (Prior) on Jul 05, 2006 at 15:32 UTC
    I think the 'local' line should be:
    local $/ = \4096; # blocksize
    That is we want a reference to 4096 to set the block size.
Re^2: After Revieing the Cpan On CGI, wrt Uploading things
by barrycarlyon (Beadle) on Jul 11, 2006 at 11:22 UTC

    Here is the Working code

    package LSRfm::Application::Upload; use strict; use warnings; use base qw(LSRfm::Base); use Apache::Reload; use CGI; use CGI::Upload; #use CGI::Simple; sub setup { my $self = shift; $self->start_mode('input'); $self->run_modes([qw/input process/]);} sub input { my $self = shift; my $errs = shift; my $html_template = $self->param('html_template'); my $output; $html_template->process('upload/form', {wrapper => $self->wrapper(), errors => $errs}, \$output) || die $html_template->error; return $output; } sub process { my $self = shift; my $html_template = $self->param('html_template'); my $q = $self->query; my $script = $q->script_name; my $filename = $q->param('uploaded_file'); my $from; my $fh = $q->upload('uploaded_file'); my $diff_name = $q->param('diff_name'); my $totalbytes; my ($bytesread, $buffer); my $num_bytes = 1024; my $destination = "/home/lsrfm/webs/www.lsrfm.com/htdocs/uploads/"; #check rm my ($results, $err_page) = $self->check_rm('input', { required => [qw/uploaded_file/], filters => ['trim'], msgs => { missing => 'Please S +upply a File Name', } }); return $err_page if $err_page; #sall good patch together # if ($diff_name) # { # $filename = $diff_name; # } my $output_file = $destination . $fh; #upload time open (OUTFILE, ">", "$output_file") or die "Couldn't open $output_fi +le for writing: $!"; while ($bytesread = read($filename, $buffer, $num_bytes)) { $totalbytes += $bytesread; print OUTFILE $buffer; } die "$output_file Read Failure: $!" unless defined($bytesread); unless (defined($totalbytes)) { print "<p>Error: Could not read file $filename, "; print "or was of zero length"; } else { print "<p>Done ok, $totalbytes</p>"; } close OUTFILE or die "Couln't Close file $!"; #output my $output; $html_template->process('upload/form', {wrapper => $self->wrapper(), status => "sall_good", file => $filename, dest => $destination, from => $from, }, \$output) || die $html_template->error; return $output; } 1;

    Dont forget to set the enctype of your form to enctype of "multipart/form-data"

    Barry Carlyon barry@barrycarlyon.co.uk

      And here is a working version which allows you to change the filename

      package LSRfm::Application::Upload; use strict; use warnings; use base qw(LSRfm::Base); use Apache::Reload; use CGI; use CGI::Upload; #use CGI::Simple; sub setup { my $self = shift; $self->start_mode('input'); $self->run_modes([qw/input process/]);} sub input { my $self = shift; my $errs = shift; my $html_template = $self->param('html_template'); my $output; $html_template->process('upload/form', {wrapper => $self->wrapper(), errors => $errs}, \$output) || die $html_template->error; return $output; } sub process { my $self = shift; my $html_template = $self->param('html_template'); my $q = $self->query; my $script = $q->script_name; my $filename = $q->param('uploaded_file'); my $upload_file = $q->param('uploaded_file'); my $diff_name = $q->param('diff_name'); my $totalbytes; my ($bytesread, $buffer); my $num_bytes = 1024; my $destination = "/home/lsrfm/webs/www.lsrfm.com/htdocs/uploads/"; #check rm my ($results, $err_page) = $self->check_rm('input', { required => [qw/uploaded_file/], filters => ['trim'], msgs => { missing => 'Please S +upply a File Name', } }); return $err_page if $err_page; #sall good patch together if ($diff_name) { $filename = $diff_name; } my $output_file = $destination . $filename; #upload time open (OUTFILE, ">", "$output_file") or die "Couldn't open $output_fi +le for writing: $!"; while ($bytesread = read($upload_file, $buffer, $num_bytes)) { $totalbytes += $bytesread; print OUTFILE $buffer; } die "$output_file Read Failure: $!" unless defined($bytesread); unless (defined($totalbytes)) { print "<p>Error: Could not read file $filename, "; print "or was of zero length"; } else { print "<p>Done ok, $totalbytes</p>"; } close OUTFILE or die "Couln't Close file $!"; #output my $output; $html_template->process('upload/form', {wrapper => $self->wrapper(), status => "sall_good", file => $filename, dest => $destination, from => $filename, }, \$output) || die $html_template->error; return $output; } 1;

      Dont forget to set the enctype of your form to enctype of "multipart/form-data"

      Barry Carlyon barry@barrycarlyon.co.uk