Forum Webscript.Ru

Программирование => Perl => Тема начата: dan3k от 18 Июня 2003, 20:52:29

Название: Как расшифровать на перле форму
Отправлено: dan3k от 18 Июня 2003, 20:52:29
Уважаемые, помогите с расшифровкой на перле формы с параметром enctype="multipart/form-data"!

Требуется сделать upload, но не хочу юзать CGI.pm

Я расшифровываю формы так:
my $buffer;
if ($ENV{\'REQUEST_METHOD\'} eq \'GET\'){
$buffer=$ENV{\'QUERY_STRING\'};
}
elsif ($ENV{\'REQUEST_METHOD\'} eq \'POST\'){
read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
}
my @pairs = split(/&/, $buffer);
foreach (@pairs){
my ($name, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s///g;
$input{$name} = $value;
}

Но после того, как я в форму добавляю enctype="multipart/form-data" все перестает работаеть (%input пустой).

У меня скоро псих начнется из-за этой проблемы - я вот уже неделю каждый день часа по 3 мучаюсь:)
Название: Как расшифровать на перле форму
Отправлено: Xander от 18 Июня 2003, 20:58:01
а почему ты не хочешь использовать готовый модуль, если не секрет?
Название: Как расшифровать на перле форму
Отправлено: dan3k от 18 Июня 2003, 21:34:42
Я не юзаю CGI - пока своими силами обхожусь.
Но вот потребовалось сделать аплоад для админ-панели. Не делать же только из-за этого use CGI!
Тем более, что скорость работы без него 0,06 секунды, а с ним 0,8. Ну зачем мне просто так грузить его?
Название: Как расшифровать на перле форму
Отправлено: Xander от 18 Июня 2003, 22:11:39
ну, это вопрос того, что ценишь больше - те 0,76 секунды, которые пользователь из-за ограниченной скорости канала все равно не заметит, или неделю своего времени...

но если ты все ж таки хочешь изобрести велосипед, то скажи - ты вообще проверял, что именно у тебя оказывается в $buffer при использовании enctype="multipart/form-data" ?
Название: Как расшифровать на перле форму
Отправлено: dan3k от 18 Июня 2003, 22:26:27
Цитировать
неделю своего времени...

Эээ... Неделя уже потеряна. Вторая пошла :)

Цитировать
ты вообще проверял, что именно у тебя оказывается в $buffer при использовании enctype="multipart/form-data"

Нет :). Сейчас посмотрю.

Я не пойму, а что, все остальные юзают CGI.pm?!

Я от него почти полность отказался, куки даже сам цепляю, а вот с аплоадом херня получается.
Название: Как расшифровать на перле форму
Отправлено: Xander от 18 Июня 2003, 22:29:55
[w]PFWWWParams[/w]
Название: Как расшифровать на перле форму
Отправлено: dan3k от 18 Июня 2003, 23:03:35
Ты предлагаешь выдрать из cgi-lib нужные мне вещи?
Название: Как расшифровать на перле форму
Отправлено: Chs от 18 Июня 2003, 23:13:57
Цитировать

Ты предлагаешь выдрать из cgi-lib нужные мне вещи?

Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm :), а потом внимательно прочитать  rfc2616.
Название: Как расшифровать на перле форму
Отправлено: dan3k от 19 Июня 2003, 00:16:11
Цитировать
Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm

Я пытался... около часа ушло впустую... Нет, выдрать из CGI.pm нужные мне данные не в моих силах.

Цитировать
потом внимательно прочитать rfc2616.

Ну и здоровый он... Я поиском просмотрел, но там не встречается слова "enctype" и "multipart/form-data "...

P.S. Я правильно понял, что ВСЕ скрипты на перл пишутся с использованием CGI.pm?
Название: Как расшифровать на перле форму
Отправлено: Макс от 19 Июня 2003, 00:40:44
Цитировать
P.S. Я правильно понял, что ВСЕ скрипты на перл пишутся с использованием CGI.pm?
только если в нем есть необходимость :)

Вот можешь еще глянуть :
http://www.dklab.ru/chicken/nablas/4.html
http://www.dklab.ru/chicken/nablas/6.html
хотя сам я  их не юзал, вот кстати их критика:
http://www.dklab.ru/chicken/nablas/18.html
Название: Как расшифровать на перле форму
Отправлено: dan3k от 19 Июня 2003, 08:48:53
Ээ.. Я не хочу использовать вместо CGI другой модуль. Я хочу выдрать нужный мне кусок кода и вставить его в свой скрипт. Хотя... из другого модуля я может быть и вытащить то, что мне надо...
Название: Как расшифровать на перле форму
Отправлено: Chs от 19 Июня 2003, 09:29:59
Цитировать
Ну и здоровый он... Я поиском просмотрел, но там не встречается слова "enctype" и "multipart/form-data "...

Плохо искал: в rfc2616 явная ссылка по поводу multipart/form-data на rfc1867.:)
Название: Как расшифровать на перле форму
Отправлено: Phoinix от 19 Июня 2003, 17:38:21
dan3k

http://www.pyaticom.ru/upload/upload.zip (http://www.pyaticom.ru/upload/upload.zip)

Здесь маленький простенький скрипт для upload без использования CGI глянь его...
У меня по крайней мере он работал прекрасно...
Название: Как расшифровать на перле форму
Отправлено: Mog. от 19 Июня 2003, 17:39:34
Цитировать
Chs:
Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm , а потом внимательно прочитать rfc2616.
По моему надо в обратной последовательности это делать. [off]В очередной раз заглянул в CGI.pm и в очередной раз насладился отточенностью кода (на мой чайниковский взгляд).[/off]

Нашел тут скрипт у себя и т.к. я "not можете присоединять файлы", попробую всунуть сюда.
Сразу хочу сказать, что писал это дело не я. Посмотри в чем разница между методами пост и гет и чем отличается multipart/form-data от как_её_там_по_умолчании

#!c:\\perl\\bin\\perl.exe
#use CGI::Carp qw( fatalsToBrowser );
########################  Config:  ##############################
#                                                               #
$dirpath="../upload"; #Dir, where you want to save uploaded files#
#                                                               #
#################################################################

print "Content-type: text/html\\n\\n";
if ($ENV{\'CONTENT_TYPE\'} =~ /^multipart\\/form-data/)
    {
    if ($ENV{\'CONTENT_TYPE\'} =~ /boundary=(\\"?([^\\";,]+)\\"?)*/ ) {
        $boundary = $1;
        }
    binmode STDIN;
    $filename="";
    read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
    @buffer = split(/\\r\\n/,$buffer);
    foreach $line (@buffer)
        {
        if ($line =~ /$boundary/)
            {
            $Current = "";
            next;
            }
        if ($line =~ /Content-Disposition/)
            {
            print "$line\\n
";
            if ($line =~ /^.+name\\s*=\\s*"*([^\\s"]+).+$/)
                {
                $Current = $1;
                }
            if ($filename eq ""){$filename = $1}
            $INPUT{$Current} = "";
            next;
            }
        if ($line =~ /Content-Type/)
            {
            $line =~ s/Content-Type:/ /g;
            $line =~ s/text\\///g;
            $line =~ s/image\\///g;
            $line =~ s/audio\\///g;
            $line =~ s/ //g;
            $line =~ s/pjpeg/jpeg/g;
            $type=$line;
            $Current = "File";
            $INPUT{\'File\'} = "";
            next;
            }
        if (($line eq "") && ($Current ne "File"))
            {
            next;
            }
        $INPUT{$Current} .= $line;
    }
}
elsif ($ENV{\'REQUEST_METHOD\'} eq "GET")
    {
        $buffer = $ENV{\'QUERY_STRING\'};
    }
elsif ($ENV{\'REQUEST_METHOD\'} eq "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;
    if ($fields{$name})
        {
        $fields{$name} = $fields{$name}.",".$value;
        }
    else
        {
        $fields{$name} = $value;
        }
    }
if ($filename =~ /\\//)
{
    @array = split(/\\//, $filename);
    $real_name = pop(@array);
}
elsif ($filename =~ /\\\\/)
{
    @array = split(/\\\\/, $filename);
    $real_name = pop(@array);
}
else
{
        $real_name = "$filename";
}


############################# Saving File: #############################

open (FILE, ">$dirpath/$real_name");
binmode FILE;
print FILE $INPUT{\'File\'};
close FILE;


############################ Printing Results ##########################

print << "[END]";
You was uploaded this file:
 
$real_name

[END]


#########################################################################
#                  Script by Lunarium Host                              #
#                              2001                                     #
#                  E-mail: petrukha@mgsu.ru                             #
#                      Vercion 1.0.0                                    #
#                                                                       #
#                  Thank You for interesting                            #
#                     my Work and Hobby ;-)                             #
#                                                                       #
#########################################################################
Название: Как расшифровать на перле форму
Отправлено: dan3k от 19 Июня 2003, 17:44:15
Phoinix
Mog.
Ребят, огромное спасибо. Сейчас буду разбираться. О результатах расскажу.
Название: Как расшифровать на перле форму
Отправлено: dan3k от 23 Июня 2003, 11:19:08
Результат = 0 :(
Ни один скрипт не работает.
У того, что написан выше ошибка где-то в разборе параметров формы :(
Скрипт от Phoinix вообще ни на что не реагирует - показывает только формочки и все, т.е. тоже параметры неправильно принимает.
Название: Как расшифровать на перле форму
Отправлено: Phoinix от 23 Июня 2003, 13:33:46
dan3k
Скрипт стандартный FreeWare взятый, кажется с CGI.ru. но рабочий, по крайней мере у меня он upload делает... посмотри переменную $base в 60 строке, куда он записывает файлы...
И еще, в этом скрипте нет подтверждения, что upload сделан, он просто возвращается в исходное сотояние, проверь папку в которую должен был производится upload...
Название: Как расшифровать на перле форму
Отправлено: Chs от 23 Июня 2003, 14:38:17
Ээээ...значит так:
Работающий скрипт upload сеть в ФАКе.
Тему закрыл
Если есть желание обсуждать тонкости разбора multypart/form-data - милости прошу в отдельный тред.