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

Hi, im trying to use perl to grab an image from a given url and copy it into my web folder, it works fine in localhost, but just dont copy it when i upload the script into a server, Thats the code
#!/usr/bin/perl BEGIN { $|=1; print "Content-type: text/html\n\n"; use CGI::Carp('fatalsToBrowser'); } use CGI; use LWP::Simple; $q= new CGI; $my_data=$q->param('set'); $lower=1000; $upper=2000000; $random = int(rand( $upper-$lower+1 ) ) + $lower; $filename="file$random.jpg"; getstore($my_data,"../temp/$filename");
any help would be most appreciated thanks

Replies are listed 'Best First'.
Re: getstore problem
by Corion (Patriarch) on Jan 25, 2005 at 13:49 UTC

    You are using a relative directory path, and your current directory is not what you think. Use the full path to your "temp" directory, or better, use the File::Temp module to create a filename for a temporary file:

    #!/usr/bin/perl -wT use strict; BEGIN { $|=1; print "Content-type: text/html\n\n"; use CGI::Carp('fatalsToBrowser'); } use CGI; use LWP::Simple; use File::Temp qw(tempfile); use CGI::Untaint; my $handler = CGI::Untaint->new($q->Vars); my ($fh,$name) = tempfile( "fileXXXXXXXX.jpg", DIR => '/home/web/user1 +/temp' ); my $url = $handler->extract(-as_url => 'set'); #my $url = $q->param('set'); #$url =~ m!^(http://[-.\w?&;]+.jpg)! # or die "The url does not look valid"; #$url = $1; getstore($url,"../temp/$filename");

    Please note that your script as written can be used to attack other webservers. You will want to restrict your script so it cannot be used by other people.

    Update: Changed the code to use CGI::Untaint::url, which I trust more than my half-baked, restricted attempt

Re: getstore problem
by blazar (Canon) on Jan 25, 2005 at 14:32 UTC
    #!/usr/bin/perl BEGIN { $|=1;
    I don't see any compelling good reason to put all this in BEGIN.
        print "Content-type: text/html\n\n";
    Don't! The whole point of CGI.pm is to relief you from the need of reinventing the wheel and the risks of doing it wrong.
    use CGI::Carp('fatalsToBrowser'); } use CGI; use LWP::Simple;
    Please (do a favour to yourself and) ask perl to give you all the help it can! So
    use strict; use warnings;
    as well.
    $q= new CGI; $my_data=$q->param('set'); $lower=1000; $upper=2000000; $random = int(rand( $upper-$lower+1 ) ) + $lower; $filename="file$random.jpg"; getstore($my_data,"../temp/$filename");
    Huh?!? Try reading
    perldoc -q temporary
    
    it may help.

    However chances are you're having an OS problem, not a Perl one. You say that the program doesn't work, but fail to explicitly mention what kind of error it gives you. I suggest you to do your best to help knowledgeable monks here to help you...