Автор Тема: Как расшифровать на перле форму  (Прочитано 6757 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dan3k

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Уважаемые, помогите с расшифровкой на перле формы с параметром 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

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Как расшифровать на перле форму
« Ответ #1 : 18 Июня 2003, 20:58:01 »
а почему ты не хочешь использовать готовый модуль, если не секрет?
•••Jah\'d never let us down!•••

Оффлайн dan3k

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как расшифровать на перле форму
« Ответ #2 : 18 Июня 2003, 21:34:42 »
Я не юзаю CGI - пока своими силами обхожусь.
Но вот потребовалось сделать аплоад для админ-панели. Не делать же только из-за этого use CGI!
Тем более, что скорость работы без него 0,06 секунды, а с ним 0,8. Ну зачем мне просто так грузить его?

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Как расшифровать на перле форму
« Ответ #3 : 18 Июня 2003, 22:11:39 »
ну, это вопрос того, что ценишь больше - те 0,76 секунды, которые пользователь из-за ограниченной скорости канала все равно не заметит, или неделю своего времени...

но если ты все ж таки хочешь изобрести велосипед, то скажи - ты вообще проверял, что именно у тебя оказывается в $buffer при использовании enctype="multipart/form-data" ?
•••Jah\'d never let us down!•••

Оффлайн dan3k

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как расшифровать на перле форму
« Ответ #4 : 18 Июня 2003, 22:26:27 »
Цитировать
неделю своего времени...

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

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

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

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

Я от него почти полность отказался, куки даже сам цепляю, а вот с аплоадом херня получается.

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Как расшифровать на перле форму
« Ответ #5 : 18 Июня 2003, 22:29:55 »
[w]PFWWWParams[/w]
•••Jah\'d never let us down!•••

Оффлайн dan3k

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как расшифровать на перле форму
« Ответ #6 : 18 Июня 2003, 23:03:35 »
Ты предлагаешь выдрать из cgi-lib нужные мне вещи?

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Как расшифровать на перле форму
« Ответ #7 : 18 Июня 2003, 23:13:57 »
Цитировать

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

Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm :), а потом внимательно прочитать  rfc2616.
2B OR NOT 2B = FF

Оффлайн dan3k

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как расшифровать на перле форму
« Ответ #8 : 19 Июня 2003, 00:16:11 »
Цитировать
Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm

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

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

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

P.S. Я правильно понял, что ВСЕ скрипты на перл пишутся с использованием CGI.pm?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Как расшифровать на перле форму
« Ответ #9 : 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
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн dan3k

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как расшифровать на перле форму
« Ответ #10 : 19 Июня 2003, 08:48:53 »
Ээ.. Я не хочу использовать вместо CGI другой модуль. Я хочу выдрать нужный мне кусок кода и вставить его в свой скрипт. Хотя... из другого модуля я может быть и вытащить то, что мне надо...

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Как расшифровать на перле форму
« Ответ #11 : 19 Июня 2003, 09:29:59 »
Цитировать
Ну и здоровый он... Я поиском просмотрел, но там не встречается слова "enctype" и "multipart/form-data "...

Плохо искал: в rfc2616 явная ссылка по поводу multipart/form-data на rfc1867.:)
2B OR NOT 2B = FF

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Как расшифровать на перле форму
« Ответ #12 : 19 Июня 2003, 17:38:21 »
dan3k

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

Здесь маленький простенький скрипт для upload без использования CGI глянь его...
У меня по крайней мере он работал прекрасно...

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Как расшифровать на перле форму
« Ответ #13 : 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

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как расшифровать на перле форму
« Ответ #14 : 19 Июня 2003, 17:44:15 »
Phoinix
Mog.
Ребят, огромное спасибо. Сейчас буду разбираться. О результатах расскажу.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28