stuck in perl cgi to upload a file to server

hi,
i m working on a perl cgi script which uploads a file to the server. i m stuck. i hav written the errors.
plz help.

Sachin Kaw
______________________________________________________________________
#!/usr/bin/perl -w

use CGI;
use CGI qw(:standard);
use strict;
use POSIX qw(strftime);
use Spreadsheet::WriteExcel;
#use HTML::EasyTable;
use POSIX qw(tmpnam);
use CGI::Carp qw(carpout);

$CGI::POST_MAX=1024 * 5000; # max 5MB posts

my $logfile = "/tmp/upload-mylog.log";

BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>/tmp/upload-cgi.log") or
die("Unable to open cgi.log: $!\n");
carpout(\*LOG);
}

# your custom running log function

sub mylog
{
my $curtime = strftime "%a %b %d %T", localtime;
my $curfunc = (caller(1))[3];

if\( !defined $curfunc \)\{
  $curfunc = "main:";
\}

my $FL;
open\( FL, ">>$logfile" \) || die "could not open file";
print FL "$curtime: $curfunc: $_[0]\\n";  \# This line prints to the log

close \(FL\);

}

    my $q = new CGI;
    \#my $filename='filename';
    my $upload_filehandle;


    mylog \( "______ mylog \( \_\_LINE__ . ": Before entering if block" \);


    if \(param\(\)\) \{

            mylog \( \_\_LINE__ . ": We have the form populated." \);

            \# upload directory
             my $upload_dir = "/home/skw";

            \# reading the form variables
            my $filename = $q->param\('filename'\);
            mylog\("filename = $filename"\);
            $filename =~ s/.\*[\\/\\\\]\(.*\)/$1/;
            mylog\("file = $filename"\);

            \# getting the file handle
            $upload_filehandle = $q->upload\('filename'\);
            mylog\("fd = $upload_filehandle"\);                         \#error 1

            \# saving the file
            open \(OUTFILE, ">$upload_dir/$filename"\);         

            \#binmode UPLOADFILE;

            while \( <$upload_filehandle> \)                    $error 2 & 3
            \{
            print OUTFILE  $_;
            \}

            close OUTFILE;
            print $q->header\(\);
            \#print <<END_HTML; 

      \}
      else \{

            mylog \( \_\_LINE__ . ": Form is not populated." \);
            \#$strhtml .= $q->end_html;
      \}

___________________________________________________________________________

error 1:- Use of uninitialized value in <HANDLE>

error 2:- Use of uninitialized value in concatenation (.)

error 3:- readline() on unopened filehandle

I'm uncertain about file uploads. I previously made one in a similar manner with the CGI module and it worked on my system. A wild guess ... Your form has a file upload control with the name exactly as 'filename'? And does the $filename return some valid filename? Also verify that the permission of your upload directory is writable by the webserver running the script. Check the CGI module doc for possible locations the module will try for the upload spooling directories.

yes,my form has a file upload control with the name exactly as 'filename'.

yes, $filename retuns a valid filename.

yes, the permission of your upload directory is writable by the webserver running the script.

inspite of all this, my script is still not working.

the problem is with the file handler. the script is not reading the file through the file handler.
Do i have to include any module to use the file handler?

plz help

Normally that should be it. Because what upload() returns is a filehandle you should be able to read it right away (provided a valid filehandle is returned). But now obviously the filehandle is undef. That was why I tried to make the guess that probably your temporary directory could not be written into, and so cannot be open()ed so no valid filehandle is returned.

Try this. Log the output of

$q->cgi_error

as the program proceeds. See if you get any error messages before or around the upload() method.

#my $filename='filename';
###$filename isnt set here (as it's commented out), nor anywhere else so.....

this means $filename =~ s/.*[\/\\](.*)/$1/; will fail as $filename isnt initilized.

And so

open (OUTFILE, ">$upload_dir/$filename"); cant open a valid handle

so when it writes handle is invalid.

Tip: try using open (OUTFILE, ">$upload_dir/$filename") or die ($!);

AAR.