Простой скрипт для многочастных форм

Я работал на тестовом ПК 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 и т. Д., Но таким образом я - и, возможно, другие - могу следить за происходящим, а не зашифрованным шорткодом.

0 ответов

Другие вопросы по тегам