Каким-то образом я избегал 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 имя элемента формы, «файл»), а скорее то, что я думаю, это содержимое ключей.
Есть ли простой способ перевести эти данные в пригодную для использования форму?