Hey everyone, here's my problem:
 
I have a script to take information and put it in a database, and also upload a resume.  The entire thing works on my test machine (Win98/Activeperl/Apache) but doesn't work on my actual machine (Digital Unix/Perl5+/Apache). 
 
I've attached the entire script, but the relevant parts are copied here:
 
<code>
{
 no strict;
 $resume = $cgi->upload('resume');
 my ($buffer,$bytesread);

 open (OUTFILE, ">resumes/$newname")|| print "<h2>Cannot write resume!</h2>";
 binmode OUTFILE;

 while($bytesread=read($resume,$buffer,1024) ){
    print OUTFILE $buffer;
 }
 close(OUTFILE);
}
</code>
 
"resume" is the name of the upload field, and naturally, everything is done with CGI.pm.  I only want people to upload word documents, so I do every upload with binmode.  $newname has the desired filename, and I want it uploaded into the resumes folder. 
 
Here are the things I've tried:
 
1) I have it in a 'no strict' block because the CGI.pm docs said that Perl complains when using a string for a filehandle. 
2) Using the $cgi->upload() also suggested in the CGI.pm docs.
3) Changing the permissions of the resumes/ folder, from 644, 744, 711, but I figured all it really needs is owner rwx, since the script runs as me. 
 
Could this be a server related thing?  There may be other issues with the script, (SECURITY) but for now, I just want something functional.  Any help would be appreciated.
 
Thanks,
Ryan
#!/usr/local/bin/perl5 -T
#Ryan Davis
#member database adder

use lib "/home/aitp/lib";
use Mail::Sendmail;
use DBI;
use CGI;
use LWP::Simple;
use strict;


my $version = "1.00";
my $cgi = new CGI;
my $dbh = connectDB();

my %terms = (
      "Fall 2001" => "fa01" ,
      "Spring 2002" => "sp02",
      "Summer 2002" => "su02",
      "Fall 2002" => "fa02",
      "Spring 2003 and Beyond" => "sp03",
);
my @terms = ("<b> Fall 2001 </b><br>", "<b>Spring 2002</b><br>", "<b>Summer 
2002</b><br>", "<b>Fall 2002</b><br>", "<b> Spring 2003 and Beyond</b><br>"); 

my $errors = "";
my ($fn, $ln, $grad, $email, $url, $gpa, $keywords, $page,$resume,$temp);

#get webpage template
my @html = split(/perlaitpinsert/, getTemplate("perlaitp.htm"));

my $state = $cgi->param('State');
$cgi->delete('State');

print $cgi->header(), $html[0], "<img src=\"../images/aitp\_introd.jpg\">", $html[1];

#SIDEBAR GOES HERE
print "<H2>AITP Member Database</H2><BR>";

print $cgi->start_form(-action=>"member-add.cgi");
print $cgi->submit("Submit","Add your Info");
print $cgi->end_form;
print $cgi->start_form(-action=>"member-view.cgi");
print $cgi->submit("Submit","View List");
print $cgi->end_form;

print "Version: $version";
#END SIDEBAR
print $html[2];



unless($state){

ADDENTRY:

        print "<h2>Add your entry</h2>";
        print "This form adds your information to our searchable database, and 
includes you in our resume CD.<br>";

        print "<font color=\"FF0000\"><b>";
        print $errors;
        print "</b></font>\n";

        print $cgi -> start_multipart_form(-method=>"GET");

        print "First Name: <br>";
        print $cgi -> textfield("fn");  
        print "<br>";
        print "<br>Last Name: <br>";
        print $cgi -> textfield("ln");  
        print "<br>";
        print "<br>E-mail Address: <br>";
        print $cgi -> textfield("email");       
        print "<br>";

        print "<br>What semester will you be graduating? <br>";
        #display a scrolling list
        print $cgi -> scrolling_list(
                -NAME => "terms",
                -VALUES => [keys %terms],
                -LABELS => {\%terms},
                -SIZE => 1,
                -MULTIPLE => 0,
        );
        print "<br><br>Enter the URL where you professional website is 
located:<br>http://";;
        print $cgi -> textfield("url");
        print "<br><br>Provide your GPA (optional): <br>";
        print $cgi -> textfield(
                -NAME => "gpa", 
                -MAXLENGTH => 4,
                -SIZE => 4,
                -DEFAULT => "N\/A"
        );
        print "<br><br>Enter any helpful keywords other than the information 
<br>provided above in which you think I recruiter may use as a search term: <br>";
        print $cgi ->textarea(
                -NAME => "keywords",
                -ROWS=> 10,
                -COLUMNS => 30,
        );
        print "<br><br>Upload your resume, in MS Word format: (70KB limit)<br>";
        print $cgi->filefield('resume','starting value',40,180);

        print "<br><br>";
        print '<input type="hidden" name="State" value="filled">';
        print $cgi -> submit("Submit");
        print $cgi -> end_form();

}elsif($state eq "filled"){
        
        #READ IN ALL THE VALUES
        $fn = $cgi -> param("fn");
        $ln = $cgi -> param("ln");
        $grad = $cgi -> param("terms");
        $email = $cgi -> param("email");
        $url = $cgi -> param("url");
        $gpa = $cgi -> param("gpa");
        $keywords = $cgi -> param("keywords");
        $resume = $cgi->param("resume");
        chomp(($fn,$ln,$grad,$email,$url,$gpa,$keywords,$resume));      
        $url =~ s#http://##;
        my $newname = "";
        
        #MAKE SURE ALL INFO WAS PROVIDED
        $errors = "";
        if($fn eq ""){$errors .= "Please enter a valid first name.<BR>";}
        if($ln eq ""){$errors .= "Please enter a valid last name.<BR>";}
        unless($email =~ /^\w+([\.-]?\w+)*@\w+([\.]?\w+)*(\.\w{2,3})+$/){
                $errors .= "Please enter a valid email address.<BR>";
        }
        unless($gpa eq "N/A"){
                unless(($gpa =~ /[0-9](\.[0-9]*|)/)&&($gpa <= 4.0)&&($gpa > 
0)){$errors .= "Please enter a valid GPA.<BR>";}
        }
        unless($url eq ""){
                unless($url =~ /\S/){$errors .= "Please enter a valid URL.<BR>";}
                $page = get("http://$url";);
                unless($page){$errors .= "That website is inaccessible.  Please check 
the spelling.<BR>";}
        }
        if($resume eq ""){
                $errors .= "Please upload a resume.<br>";
        }else{
                $newname = $resume;
                $newname =~ s/.*(\....$)/$1/;
                unless($newname eq ".doc"){$errors .= "Please upload a Word 
document.<br>"}
                
        }
        unless($errors eq ""){goto ADDENTRY;}
        $newname = $resume;
        $newname =~ s/.*(\....$)/$1/;
        $temp = $fn;
        $temp =~ s/^(..).*/$1/;
        $newname = $ln.$temp.$newname;

        #untaint
        if ($newname =~ /^([-\@\w.]+)$/) {$newname = $1;}

        {
        no strict;
        $resume = $cgi->upload('resume');
        my ($buffer,$bytesread);
    open (OUTFILE, ">resumes/$newname")|| print "<h2>Cannot write resume!</h2>";
        binmode OUTFILE;
        while($bytesread=read($resume,$buffer,1024) ){
                print OUTFILE $buffer;
                print "<br>$bytesread";
    }
        close(OUTFILE);
        }


        #insert values into database
        my $sth = $dbh->prepare(q{insert into members 
                                                                
(firstname,lastname,graddate,
                                                                
email,website,gpa,keywords,resume)
                                                                values 
(?,?,?,?,?,?,?,?)
        });

        $sth->execute($fn, $ln, $terms{$grad}, $email, $url, $gpa, $keywords, 
$newname) || dienice($DBI::errstr);
        print "<h2>Your information has been added.</h2><br>";
        print "You will be recieving an email shortly confirming your information.";
        print "<br><br>AITP reserves the right to remove any entry for any reason.";

        #SEND AN E-MAIL TO [EMAIL PROTECTED]
        my $message = "Name= $fn $ln\nEmail= $email\nURL= $url\nGPA= $gpa\nKeywords= 
$keywords\nFile= $resume\n";
        my %mail = ( "To" => '[EMAIL PROTECTED]',
                "From" => 'AITP-Member-CGI <[EMAIL PROTECTED]>',
                "Subject" => "\"$fn $ln\" has added to list",
                "Message" => $message);
        sendmail(%mail) or print $Mail::Sendmail::error;
        #SEND AN EMAIL TO THE PERSON THAT ADDED
        $message = "You have just been added to the AITP Member database.\nIf this 
information is not correct, immediately reply or email 
aitp\@grove.ufl.edu.\n\n".$message;
        %mail = ( "To" => $email,
                "From" => 'AITP-Member-CGI <[EMAIL PROTECTED]>',
                "Subject" => "You have been added as \"$fn $ln\"",
                "Message" => $message);
        sendmail(%mail) or print $Mail::Sendmail::error;




}

print $html[3];
$dbh->disconnect;

#---------------Connect to the palm.grove database-----------------
sub connectDB(){
        my $dbname = 'aitp';
        my $dbhost = 'localhost';
        my $dsn = "DBI:mysql:database=$dbname;host=$dbhost";
        my $dbh2=DBI->connect($dsn,'aitp',"worlando");
        if (!defined($dbh2)) {
          print header;
          print "\nerror: There is a problem connecting to the MySQL database:\n";
          print "-" x 25;
          exit;
        }
        $dbh2->{RaiseError} = 1; # do this, or check every call for errors
        return $dbh2;
}

#---------------Get the HTML template from an .htm file-----------------

sub getTemplate(){
        my $t = $_[0];
        my $template = "";
        open(AITP, $t) || dienice("Unable to process HTML templates.");
        while(<AITP>){$template .= $_;}
        close(AITP);
        return $template;
}

#---------------------exit gracefully---------------------------------
sub dienice(){
        my $msg = shift;
        print "There has been an error.  Please log out and try again.<BR>", $msg, 
$html[3];
        #other log-out code.
        $dbh->disconnect;
        exit;
}

#---------------------print to a table---------------------------------
sub table(){
        foreach $_ (@_){
                print "<td>$_</td>";
        }
}


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to