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

Hi there.

This may not be a "pure" PERL question, but I think it's an interesting case, and I hope that somebody here had passed trough the same thing.

I have a html form that can't use the enctype="multipart/form-data" stuff or one of my subs wont work. In this same form I have a <input type="file"> field that, once filled should put the specified file in the server.

The thing is that if I don't use the enctype, the file is written with it's name as it's content.

This is the original piece of code that works with enctype:
open(ARQ,">$dir$foo_file"); binmode ARQ; print ARQ $foo_file; close(ARQ);
I'm getting the form data from a sub written by me that goes as follows:
sub GetForm { $n = 0; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @par = split(/&/, $buffer); open (TXT,">dsp.txt"); foreach $temp (@par) { my ($nome,$valor) = split(/=/,$temp); $valor =~ tr/+/ /; $valor =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg +; $valores[$n] = $valor; $n++; } close(TXT); }
I've had to do it this way because I have a <select multiple> and I need to get all selected values from it.

Any comments, possible solutions, tips would be gratefully appreciated.

Best regards,

Er Galvão Abbott
a.k.a. Lobo, DaWolf
Webdeveloper

Replies are listed 'Best First'.
(Ovid) Re: Putting a file on Windows NT without multipart/form-data
by Ovid (Cardinal) on Nov 17, 2001 at 02:12 UTC

    DaWolf wrote, regarding a hand-coded alternative to CGI.pm:

    I've had to do it this way because I have a <select multiple> and I need to get all selected values from it.

    No, you didn't need to do it that way. You needed to ask the Perlmonks for help :) Consider the following <select> in HTML:

    <select name="color" multiple> <option value="1">Red</option> <option value="2">Blue</option> <option value="3">Green</option> </select>

    To grab all of the selected values with CGI.pm, use an array instead of a scalar for the CGI::param() call:

    #!/usr/bin/perl -wT use strict; use CGI qw/:standard/ my @colors = param( 'color' );

    If you just used a scalar (e.g. $color), the param call would only return the first value selected. Using an array returns all of the selected values.

    Side note: the browser will not send the file contents unless you use multipart/form-data. That's why it was this enctype was developed.

    Cheers,
    Ovid

    Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.