Yes you can and here's a very messy way to do it. The reason I had to 'roll-my-own' is because a browser plugin we had to use for a project didn't quite send the data in a proper GET/POST request, therefore CGI.pm couldn't handle the data. For "commercial" reasons, I've had to extract that specific part of the file:
sub library_read_form { # Reads the incoming data from the web browser my ($buffer,$pair,$datasent,$name,$value,$mydata,$filename,$contentty +pe)=("","","","","","","",""); if (length($ENV{'CONTENT_LENGTH'})>0) { if ($ENV{'CONTENT_TYPE'}=~/^multipart\/form-data/i) { binmode(STDIN); # cope with Windows platforms - but only if we have + to... } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if (length($ENV{'QUERY_STRING'}>0)) { $buffer.="&".$ENV{'QUERY_STRIN +G'};} } else { $buffer=$ENV{'QUERY_STRING'}; } foreach $var (sort(keys(%ENV))) { $val = $ENV{$var};$val =~ s|\n|\\n|g;$val =~ s|"|\\"|g; } if (($buffer=~/^\<doc /) && ($buffer=~/\<\/doc\>\n?$/)) { ### section removed..... ### don't ask what this did or why, I'm not allowed to say :( } else { if (!($ENV{'CONTENT_TYPE'}=~/^multipart\/form-data/i)) { @pairs = split(/(&|;)/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $datasent.=";$name=$value"; if (length($form{$name})>0) { $value=$form{$name}."\0".$value; } $form{lc($name)} = $value; } } else { $ENV{'CONTENT_TYPE'}=~/boundary=([^"]+)/i; $boundary="--".$1;$section=0; @lines=split(/(\n|\r)/,$buffer); MULTIPART: foreach $line (@lines) { if ($section==3) { if ($line=~/content-type:\s?(.*)/i) { $contenttype=$1; } elsif (!($line=~/^(\n|\r|\n\r|\r\n)?$/)) { $section=4; } } elsif ($section==2) { if ($line=~/^content-type:\s?(.*)/i) { $contenttype=$1; } elsif ($line=~/^(\n|\r|\n\r|\r\n)?$/) { $section=3; # data possibly starts next line } } elsif ($section==1) { if ($line=~/^content-disposition:\s?form-data;\s?name="([^"]+)" +(.*)$/i) { $name=$1;if ($2=~/filename="([^"]+)"/) { $filename=$1; } $section=2; # prepare for data } } if ($line=~/^$boundary(--)?$/) { $section=1;# found boundary if ((length($name)>0) && (length($filename)<1)) { chomp($mydata);chop($mydata); # munch munch $datasent.=";$name=$mydata"; if (length($form{$name})>0) { $mydata=$form{$name}."\0".$mydata; + } $form{lc($name)}=$mydata; } elsif (length($name)>0) { $form_filenames{$name}=$filename;$form_contenttype{$name}=$conte +nttype; $tempfile=$tempdir.(time())."_".int(rand(300000)); $tempfile.=".tmp"; open (DATA,">".$tempfile) || die("Unable to open temp directory +for storage\n"); binmode(DATA);print DATA $mydata;close DATA; $form_data{$name}=$tempfile; } $name="";$mydata="";$filename="";$contenttype=""; } if ($section==4) { $mydata.=$line; } } } } $datasent.=";"; }
Data is normally stored in the $form hash (for example $form{'lastnode_id'}=160961), but if have an uploaded file (say from a <input type="file" name="tester"> tag, you'll have $form_data{'tester'} (which contains the name of the temporary file), $form_filenames{'tester'} (which contains the 'user provided' upload path), $form_contenttype{'tester'} (which contains the user provided MIME type).
Ok, ok, the code is neither neat, (probably not) secure or 'strict-safe' but it should give you an idea how to do what you are trying to achieve (and it's been happily running on a Windows2000 Server box with Apache for nearly 2 years now). Please consider using CGI.pm unless you have a REALLY good reason not to!

In reply to Re: Can I do a file upload without using any modules? by beebware
in thread Can I do a file upload without using any modules? by frinky

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.