Получить файл загрузки в Perl без CGI.pm - PullRequest
0 голосов
/ 01 апреля 2020

Каким-то образом я избегал CGI.pm на протяжении многих лет, но в конце концов собирался сломать его и использовать, чтобы я мог получать загрузки файлов из формы HTML, которую я построил. Однако, когда я пошел принять его, я заметил, что CGI.pm устарел. Тем не менее, похоже, что практически каждый учебник о том, как получать загружаемые файлы в Perl, зависит от CGI.pm, однако.

Я бы хотел пропустить CGI.pm, если это возможно, либо используя некоторые другой более сфокусированный модуль, который только выполняет загрузку или просто работу с данными напрямую. Обычно у меня есть два хэша, которые я генерирую в своем коде - один для данных GET и один для данных POST, причем каждый ключ формы является ключом в этих хэшах. Когда я пытаюсь загрузить файл, он загружается по протоколу POST, но если я попытаюсь изучить данные формы, используя Data :: Dumper, чтобы понять это, вместо того, чтобы иметь различимые ключи, я получу тысячи строк символов, которые предположительно являются файлом загрузить себя.

Сама форма создается Dropzone. js с использованием этого кода:

    $("#fileUploadDropzone").dropzone({ 
        url: "/cgi-bin/safari/safari_administration.pl?action=uploadFile&aid=" + articleId + "&mode=" + mode,
        paramName: "file",
        init: function() {
            this.on("addedfile", function(file) {
                alert("Added file.");
            }),
            this.on("success", function(file, response) {
                console.log(response);
            })
        }  

    });

На стороне сервера вот что генерирует ha sh для данных POST :

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@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;
    $value =~ s/~!/ ~!/g;

    next unless $value;

    #Deal with different character sets.
    my $encoding_name = Encode::Detect::Detector::detect($value);   

    if ($encoding_name != "utf8") {
        $value = decode($encoding_name, $value) 
    }

    $FPOST{$name} = $value;
}

Я попытался вывести результаты в STDERR следующим образом:

 foreach my $key (sort keys %FPOST) {
      say STDERR "Key: " . $key;
 }

Результат не содержит ключей, которые я ожидал (например, HTML имя элемента формы, «файл»), а скорее то, что я думаю, это содержимое ключей.

Есть ли простой способ перевести эти данные в пригодную для использования форму?

...