Can Perl's CGI.pm process Firefox's <input type=“file”, multiple=“”> form fields?

前端 未结 4 1403
一生所求
一生所求 2021-01-03 07:33

Firefox 3.6 introduced a [multiple attribute on regular type=\"file\" input elements]( http://hacks.mozilla.org/2009/12/multiple-file-input-in-firefox-3-6/).

I canno

相关标签:
4条回答
  • 2021-01-03 08:09

    It doesn't look like you're following the documentation for Processing a file upload field with CGI.pm. Before we get too far into this, can you do it with one file using the documented method?

    0 讨论(0)
  • 2021-01-03 08:12

    Yes, perl's CGI.pm can proess firefox's multiple file uploads

    Want to see? Use this shortcut:

    use Data::Dumper;
    print '<pre>', $CGIo->escapeHTML( Dumper( $CGIo ) ),'</pre>';
    

    You'll see something like:

    $VAR1 = bless( {
             '.parameters' => [
                                'filename',
                                'submit'
                              ],
             'use_tempfile' => 1,
             '.tmpfiles' => {
                              '*Fh::fh00003temp-2.txt' => {
                                                            'info' => {
                                                                        'Content-Type' => 'text/plain',
                                                                        'Content-Disposition' => 'form-data; name="filename"; filename="temp-2.txt"'
                                                                      },
                                                            'name' => bless( do{\(my $o = 'C:\\WINDOWS\\TEMP\\CGItemp52869')}, 'CGITempFile' ),
                                                            'hndl' => bless( \*{'Fh::fh00003temp-2.txt'}, 'Fh' )
                                                          },
                              '*Fh::fh00001temp-1.txt' => {
                                                            'info' => {
                                                                        'Content-Type' => 'text/plain',
                                                                        'Content-Disposition' => 'form-data; name="filename"; filename="temp-1.txt"'
                                                                      },
                                                            'name' => bless( do{\(my $o = 'C:\\WINDOWS\\TEMP\\CGItemp52775')}, 'CGITempFile' ),
                                                            'hndl' => bless( \*{'Fh::fh00001temp-1.txt'}, 'Fh' )
                                                          }
                            },
             '.charset' => 'ISO-8859-1',
             'param' => {
                          'filename' => [
                                          $VAR1->{'.tmpfiles'}{'*Fh::fh00001temp-1.txt'}{'hndl'},
                                          $VAR1->{'.tmpfiles'}{'*Fh::fh00003temp-2.txt'}{'hndl'}
                                        ],
                          'submit' => [
                                        'Process File'
                                      ]
                        },
             'escape' => 1,
             '.header_printed' => 1
           }, 'CGI' );
    

    First you call your file upload field File_Input, then you call it multiple_files, then you call it myfiles -- you have to use the same name, this important.

    Also, $lightweight_fh and @lightweight_fh are two distinct variables, you'll need

    for my $lightweight_fh ( $CGIo->upload('multiple_files') ){
        my $io_handle = $lightweight_fh->handle;
        ...
    }
    

    Also, you try to open a DIRECTORY '/hidden_deliberately/' as a file, and you don't check for errors

    0 讨论(0)
  • 2021-01-03 08:19

    Woohoo, got this working. The big handbrake issue? Old CGI.pm version! It's a shame the CGI.pm documentation does not include notes alongside features such as "Introduced in version X". Many other modules/libraries/packages do.

    As it happens I had version 3.15 and the current is 3.49. I even got it working in strict mode. Anybody know why Stein uses non-strict examples?

    Here's the XHTML:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    
      <head>
        <title>Multiple file upload test</title>
    
      </head>
    
      <body>
    
        <form action="deliberately_hidden"
              method="post"
             enctype="multipart/form-data">
    
          <input type="file"
                 name="multiple_files"
             multiple="true"/>
    
          <button type="submit">Submit</button>
    
        </form>
    
      </body>
    
    </html>
    

    Here's the Perl:

    #!/usr/bin/perl
    
      use strict;
      use warnings;
    
      use CGI;
    
      my $CGIo = new CGI;
    
      print $CGIo->header();
    
      my @lightweight_fh = $CGIo->upload('multiple_files');
    
      foreach my $fh (@lightweight_fh) {
    
        # undef may be returned if it's not a valid file handle
    
        if (defined $fh) {
    
          # Upgrade the handle to one compatible with IO::Handle:
    
          my $io_handle = $fh->handle;
    
          open (OUTFILE,'>>','/deliberately_hidden/' . $fh);
    
          while (my $bytesread = $io_handle->read(my $buffer,1024)) {
    
            print OUTFILE $buffer
    
          }
    
        }
    
      }
    

    Thanks for your help everyone.

    0 讨论(0)
  • 2021-01-03 08:22

    Use the upload method in CGI.pm.

    In a list context, upload() will return an array of filehandles. This makes it possible to process forms that use the same name for multiple upload fields.

    0 讨论(0)
提交回复
热议问题