Простой скрипт для многочастных форм
Я работал на тестовом ПК Apache/Perl... и по какой-то причине данные из нескольких частей, представленные Chrome, IE и Firefox ALL, по-видимому, отсутствуют в разделе заголовка. Кроме того, вместо каждой линии границы, начинающейся с двух дефисов, они начинаются с любой величины от 10 до 30 (!). Единственная "константа" - последняя строка =IS= граница, используемая в файле с двумя дефисами в конце.
Поэтому я разработал небольшой скрипт, который (может) быть достаточно универсальным и не полагаться на данные, отправляемые через заголовки. Я просто сохраняю НИЧЕГО, поступающее через STDIN, и сохраняю его во временном файле. Затем я ввожу это и разделяю, сохраняя имя = значение в ассоциативный массив (%FORM) или сохраняя его. Я предлагаю это здесь, чтобы это могло помочь другим. (Не стесняйтесь копировать и перепечатывать в "Переполнение стека", если хотите) ** Из-за "поврежденного" характера отправляемого файла такие программы, как "CGI::Simple", не будут работать в моей автономной установке.
------WebKitFormBoundarybuoXF1pZAnTeh84Y
Content-Disposition: form-data; name="action"
postFile
------WebKitFormBoundarybuoXF1pZAnTeh84Y
Content-Disposition: form-data; name="fileUp"; filename="school2.csv"
Content-Type: application/octet-stream
Admission,FirstName,LastName,Teacher
1234567890,1Tommy,Smith, MrJones
Как отправлено Chrome. IE и Firefox просто отправляют больше дефисов в начале. Обратите внимание на отсутствие заголовков. Это ВСЕ верхняя часть файла...
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
use v5.10;
use strict;
use warnings;
my (%FORM,$data,$x);
my $flag=0;
open (my $fh, "<", "test.txt"); # Bring in the whole multipart form that has been saved out
my @tmp=<$fh>;
close($fh);
my $len=@tmp; # Find total number of rows, (including a line feed at the bottom)
my $boundary=$tmp[$len-1]; # Finds bottom boundary entry
chomp($boundary); # Removes line feed at end
my $boundaryEnd=$boundary; # If the EOF needs to be recognised for some reason
$boundary=substr($boundary,0, length($boundary)-2); # Removes the two trailing hyphen from last boundary entry so equals regular entry
for ($x=0; $x<@tmp; $x++){
if ($tmp[$x]=~/$boundary/){
$x++; # Move to the line below boundary
getData(); # Process the data
}
}
unlink "test.txt" # Delete the temp multipart form
print $FORM{'action'}; # These linew are test lines only, and where rest of program is executed (or return)
print "<br>";
print $FORM{'fileUp'};
#####
sub getData{
if ($tmp[$x]=~/Content-Disposition: form-data; name="(.*?)"; filename="(.*?)"/){
my $name=$1;
my $fileName=$2; # The original name of the uploaded file
for(my $f=($x+3); $f<$len; $f++){ # F is set to end of file, but may encounter a "last" statement before end
if ($tmp[$f]=~/^$boundary/){
$FORM{$name}=$data; # Loads data into associative array with the name used on form. (Or save)
$data=''; # Clears $data unless there is another file to upload
last;
}
$data.=$tmp[$f];
}
}
elsif ($tmp[$x]=~/Content-Disposition: form-data; name="(.*?)"/){ # Simple name=value pair
$x=($x+2);
$FORM{$1}=$tmp[$x];
}
}
Истинные программисты, возможно, победят в некоторых методологиях, таких как for / next, а не в то время как loop и т. Д., Но таким образом я - и, возможно, другие - могу следить за происходящим, а не зашифрованным шорткодом.