in reply to Re: Upload Question
in thread Upload Question

I thought my $fh = $formdata->upload($file); and my $fh = $formdata->upload('file'); are the same.

Guess not since the latter returns a defined value for $fh.

I'm still ending up with a file in my upload directory but it still contains 0K for size.

Guess I'll try working this out now that I have a defined filehandle.

Sorry about the Premature end...., I'm just trying to get the upload() thing worked out.

Joe

Replies are listed 'Best First'.
Re: Re: Re: Upload Question
by antirice (Priest) on Nov 02, 2003 at 03:05 UTC

    The Creating a File Upload Field portion of the pod for CGI.pm should give you some ideas. Just skip the first couple of paragraphs until you get to a paragraph that begins, "The filename returned is...". Just replace $filename with $fh in the examples he gives. However, be certain to read the entire section in case the OS you're using this on distinguishes between text and binary data modes.

    Hope this helps.

    antirice    
    The first rule of Perl club is - use Perl
    The
    ith rule of Perl club is - follow rule i - 1 for i > 1

      Here is where I am at now:

      #!/usr/bin/perl -w use strict; use CGI; use Fcntl; my $formdata = CGI->new; my $file = $formdata->param('file'); my $filename = $formdata->param('filename'); #user supplied fi +le name my $fh = $formdata->upload('file'); my $upload_dir = "/var/www/html/eface/client_pics/"; my $buffer = ""; print $formdata->header(); print STDERR "$file\n"; print STDERR "$filename\n"; if (defined $fh){ print STDERR "\$fh is defined\n"; } # Open the file to be wriiten into the upload directory sysopen OUTPUT, $upload_dir . $filename, O_CREAT | O_EXCL; # Write file to upload directory while (read ($fh, $buffer, 16384)){ print OUTPUT $buffer; } close OUTPUT;

      This code still gives me the file named $filename in my upload directory $upload_dir but it still contains 0K byte size.

      Now when I run in my code:

      while (<$fh>){ print; }

      it does print out data to the browser so I know that the temporary file is being found. I can't quite solve this. Any Ideas?

      Thanks Again for everyones help.

      Joe

        I don't know why you're using sysopen for this, but ok. It's possible since you're using O_EXCL, the sysopen is failing. Straight from perldoc perlopentut:

        O_EXCL - Fail if the file already exists

        So if the file's already there. Sysopen will fail. Another problem is the fact that sysopen is opening the file for READING ONLY. If you change it to O_CREAT | O_EXCL | O_WRONLY, the file will be open for writing. Finally, you always want to know if the open failed. This can be done quite simply by adding or die $!; to the end. So in summation, you actually want the following line for your sysopen:

        sysopen(OUTPUT, $upload_dir . $filename, O_CREAT | O_EXCL | O_WRONLY) +or die $!;

        Now please note that if someone tries to upload this file again, the upload will fail. Since the die doesn't present any error message to the end user himself, you may instead want to use -e whick will tell you whether or not the file or directory already exists. You can read more about opening files at perldoc perlopentut as well as file detection switches at perldoc -f -X.

        Hope this helps.

        antirice    
        The first rule of Perl club is - use Perl
        The
        ith rule of Perl club is - follow rule i - 1 for i > 1