Может ли Perl CGI.pm обрабатывать Firefoxполя формы? - PullRequest
4 голосов
/ 10 августа 2010

В Firefox 3.6 введен атрибут [множественный атрибут для обычных элементов ввода type = "file"] ( http://hacks.mozilla.org/2009/12/multiple-file-input-in-firefox-3-6/).

Я не могу заставить Perl обработать эти поля. Я могу вызвать поле в контексте списка следующим образом:

 my @files = $CGIobject->param("File_Input");

Цикл, который дает мне имена файлов в виде строк, но ничего больше.

Любые предложения приветствуются.

Вот HTML:

<!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_obfuscated" 
          method="post" 
         enctype="multipart/form-data">

      <input type="file" 
             name="multiple_files" 
         multiple="true"/>

      <button type="submit">Submit</button>

    </form>

  </body>

</html>

Вот Perl:

#!/usr/bin/perl

#use strict;
#use warnings;

use CGI;

my $CGIo = new CGI;

print $CGIo->header();

@lightweight_fh = $CGIo->upload('myfiles');

# undef may be returned 
# if it's not a 
# valid file handle

if (@lightweight_fh) {

  # Upgrade the handle to 
  # one compatible with IO::Handle:

  my $io_handle = $lightweight_fh->handle;

  open (OUTFILE,'>>','/hidden_deliberately/');

  while ($bytesread = $io_handle->read($buffer,1024)){

    print OUTFILE $buffer;

  }

}

Скрипт не вводит

if (@lightweight_fh) {

блок.

Я пробовал Data: Dumper на @lightweight_fh перед блоком if, и он буквально ничего не печатает.

Ответы [ 4 ]

6 голосов
/ 10 августа 2010

Используйте метод upload в CGI.pm .

В контексте списка upload () вернет массив файловых дескрипторов. Это позволяет обрабатывать формы, использующие одно и то же имя для нескольких полей загрузки.

5 голосов
/ 11 августа 2010

Woohoo, получил это работает. Большая проблема с ручным тормозом? Старая версия CGI.pm! Обидно, что документация CGI.pm не содержит примечаний наряду с такими функциями, как «Представлено в версии X». Многие другие модули / библиотеки / пакеты делают.

Как оказалось, у меня была версия 3.15, а текущая 3.49. Я даже заставил это работать в строгом режиме. Кто-нибудь знает, почему Стейн использует не строгие примеры?

Вот 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>

Вот 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

      }

    }

  }

Спасибо за вашу помощь всем.

3 голосов
/ 10 августа 2010

Не похоже, что вы следуете документации Обработка поля загрузки файла с CGI.pm. Прежде чем мы углубимся в это, можете ли вы сделать это одним файлом, используя документированный метод?

1 голос
/ 11 августа 2010

Да, CGI.pm в Perl может обрабатывать несколько файлов Firefox

Хотите увидеть? Используйте этот ярлык:

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

Вы увидите что-то вроде:

$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' );

Сначала вы вызываете поле загрузки файла File_Input, затем называете его множественными_файлами, затем называете его myfiles - вы должны использовать то же имя, это важно.

Кроме того, $ lightweight_fh и @lightweight_fh - две разные переменные, вам понадобится

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

Кроме того, вы пытаетесь открыть КАТАЛОГ '/ hidden_deliberately /' в виде файла и не проверяете наличие ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...