http://qs321.pair.com?node_id=143019


in reply to CGI.pm's upload gives local filename, not file itself

The upload() function's return is meant to be used as a filehandle (a re-writing of your code):

#!/usr/bin/perl -w use strict; use CGI qw(:standard); # (update: in your code you didn't import anything?! # I guess that you didn't show us the real code then... # (copy-and-paste if your friend.) (I'm referring # to the 'use CGI' line, of course.)) my $fh = upload('file'); open TEMP, ">temp.jpg" or die "error opening temp.jpg for writing: $!\ +n"; binmode TEMP; # very important on Windows-based machines { # this block is so the assignment to $/ # will not effect the rest of the script local $/ = \1024; # tell <...> to read in 1024-byte chunks. print TEMP $_ while <$fh>; } close TEMP or warn "error closing temp.jpg: $!\n";

(The use of strict and warnings is strongly reccommended.)

Replies are listed 'Best First'.
Re: Re: CGI.pm's upload gives local filename, not file itself
by Wallamaster (Novice) on Feb 03, 2002 at 04:56 UTC
    indeed that's not the original code, that was the code I simplified it down to thinking I had made some stupid mistake. your additions seemed to do the trick. thanks!

    -Eric
      ++wog for getting you on the right track and ++tilly for explaining where and why the problem was arising. I just thought that I would add this as an extra. To help show what you can do with the "local" filename and why you might want it. Also, if you are using CGI.pm, you might aswell use it.
      #!/usr/bin/perl use CGI; $co = new CGI; if (!$co->param()) { print $co->header, $co->start_html('upload a file'), "<table border=1><tr><td>", $co->center('upload a file'), $co->start_multipart_form, $co->filefield(-name=>'file1', -size=>30), $co->br, $co->submit(-value=>'Upload'), $co->end_form, "</td></tr></table>"; } else { $file = $co->param('file1'); print $co->header, $co->start_html('file uploaded'), "Uploading $file ...<br>"; @filename = split(/\\/, $file); open (FILE, ">safe/$filename[$#filename]"), print "... $filename[$#filename] uploaded."; print FILE <$file>; close FILE; } print $co->end_html;
      This is working, but of course, this script is JUST AN EXAMPLE, and you should not trust input forms. Use -T and check the file path for bad chars. Basic error checking, referrer checking, etc.
      "Better secure than sorry." -xtype