in reply to Re (tilly) 4: Quick Regex question
in thread Quick Regex question

Don't I wish it were that easy!!! I used CGI, but I couldn't get it working for the life of me, even after a week solid of work and trying out 5 different scripts! I finally got one that works for one file at a time without using CGI.pm, and it is stable. I gave up after getting that frustrated. One file isn't all that bad either when you have a slow connection. My web server has TERRIBLE documentation and I don't even have telnet access to it, so I have no clue what checks are in place there. Got any tested scripts that upload multiple files at once and work on both UNIX and WIN9X/NT boxes? If so, I would be really interested in seeing them.

Replies are listed 'Best First'.
Re (tilly) 6: Quick Regex question
by tilly (Archbishop) on Jan 14, 2001 at 09:00 UTC
    The following quick hack is not particularly good style, but it works here under Linux and I am not doing anything that should be unportable. I am just echoing back your input files, and it handles multiple files.
    #! /usr/local/bin/perl -T use strict; use CGI qw(:standard upload); use HTML::Entities; print header(), start_html('Upload Test'), h1('Upload Test'), start_multipart_form(), "Enter how many files to upload: ", textfield("filecount"), br(); for my $i (1..param('filecount')) { print "File $i: ", filefield(-name => "file$i"), br(); } print submit(); for my $file (sort grep /file/, param()) { print p(); my $handle = upload($file); unless (defined($handle)) { if ($file =~ /(\d+)/) { print h3("File request $1 did not return a handle\n"); } next; } print p(), h3("Uploaded $handle"), br(), "<pre>"; print encode_entities($_) while <$handle>; print "</pre>"; }
    (For the record I usually avoid writing CGI...don't laugh at what it looks like...)
      Hey Tilly, I tried it, but all I could get was internal server errors. Is HTML::Entities part of the standard perl distribution? I don't have a clue why it won't work.
        HTML::Entities is off of CPAN so you may not have it. Sorry for not checking. For a quick test you can make the following modification:
        --- files.pl Sat Jan 13 11:31:40 2001 +++ files2.pl Sat Jan 13 20:51:31 2001 @@ -1,7 +1,6 @@ #! /usr/local/bin/perl -T use strict; use CGI qw(:standard upload); -use HTML::Entities; print header(), start_html('Upload Test'), h1('Upload Test'), start_multipart_form(), "Enter how many files to upload: ", textfield("filecount"), br(); @@ -19,6 +18,11 @@ next; } print p(), h3("Uploaded $handle"), br(), "<pre>"; - print encode_entities($_) while <$handle>; + while (<$handle>) { + s/&/&amp;/g; + s/</&lt;/g; + s/>/&gt;/g; + print; + } print "</pre>"; }
        (The solution with the original module is able to handle unexpected input better though.)

        Also it sounds like you have not yet discovered your server error logs. If you are on a Unix-like system it will be something like /var/log/apache/error.log. When you get these internal errors the tail of that will have all sorts of useful information. In similar vein you should try running the CGI script interactively, that can identify many problems.

        Several other good tips are here - highly recommended despite the name. (A little dated now, but good advice nonetheless.)

Re: Re: Re (tilly) 4: Quick Regex question
by Fastolfe (Vicar) on Jan 14, 2001 at 08:31 UTC
    Why won't something like this work? What problems were you having with CGI?
    <form enctype='multipart/form-data' ...> <input type='file' name='file' ...> <input type='file' name='file' ...> (repeat) use CGI ':standard'; use File::Basename; foreach (param('file')) { my $basename = basename($_); $basename =~ tr/A-Za-z0-9.//cd; # strip out unwanted crap open(FILE, "> $basename") or die "$basename: $!"; print FILE <$_>; close(FILE); }
    You may have to tweak fileparse_set_fstype to match the OS of the client (see File::Basename and CGI, perhaps using $ENV{HTTP_USER_AGENT}). I haven't tested this, but is something like this what you were wanting to do?
        Speaking of stripping out unwanted crap... ;)