Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 мучаюсь:)
-
а почему ты не хочешь использовать готовый модуль, если не секрет?
-
Я не юзаю CGI - пока своими силами обхожусь.
Но вот потребовалось сделать аплоад для админ-панели. Не делать же только из-за этого use CGI!
Тем более, что скорость работы без него 0,06 секунды, а с ним 0,8. Ну зачем мне просто так грузить его?
-
ну, это вопрос того, что ценишь больше - те 0,76 секунды, которые пользователь из-за ограниченной скорости канала все равно не заметит, или неделю своего времени...
но если ты все ж таки хочешь изобрести велосипед, то скажи - ты вообще проверял, что именно у тебя оказывается в $buffer при использовании enctype="multipart/form-data" ?
-
неделю своего времени...
Эээ... Неделя уже потеряна. Вторая пошла :)
ты вообще проверял, что именно у тебя оказывается в $buffer при использовании enctype="multipart/form-data"
Нет :). Сейчас посмотрю.
Я не пойму, а что, все остальные юзают CGI.pm?!
Я от него почти полность отказался, куки даже сам цепляю, а вот с аплоадом херня получается.
-
[w]PFWWWParams[/w]
-
Ты предлагаешь выдрать из cgi-lib нужные мне вещи?
-
Ты предлагаешь выдрать из cgi-lib нужные мне вещи?
Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm :), а потом внимательно прочитать rfc2616.
-
Ну хотя бы посмотреть как сделан разбор multipart/form-data в CGI.pm
Я пытался... около часа ушло впустую... Нет, выдрать из CGI.pm нужные мне данные не в моих силах.
потом внимательно прочитать rfc2616.
Ну и здоровый он... Я поиском просмотрел, но там не встречается слова "enctype" и "multipart/form-data "...
P.S. Я правильно понял, что ВСЕ скрипты на перл пишутся с использованием CGI.pm?
-
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
-
Ээ.. Я не хочу использовать вместо CGI другой модуль. Я хочу выдрать нужный мне кусок кода и вставить его в свой скрипт. Хотя... из другого модуля я может быть и вытащить то, что мне надо...
-
Ну и здоровый он... Я поиском просмотрел, но там не встречается слова "enctype" и "multipart/form-data "...
Плохо искал: в rfc2616 явная ссылка по поводу multipart/form-data на rfc1867.:)
-
dan3k
http://www.pyaticom.ru/upload/upload.zip (http://www.pyaticom.ru/upload/upload.zip)
Здесь маленький простенький скрипт для upload без использования CGI глянь его...
У меня по крайней мере он работал прекрасно...
-
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 ;-) #
# #
#########################################################################
-
Phoinix
Mog.
Ребят, огромное спасибо. Сейчас буду разбираться. О результатах расскажу.
-
Результат = 0 :(
Ни один скрипт не работает.
У того, что написан выше ошибка где-то в разборе параметров формы :(
Скрипт от Phoinix вообще ни на что не реагирует - показывает только формочки и все, т.е. тоже параметры неправильно принимает.
-
dan3k
Скрипт стандартный FreeWare взятый, кажется с CGI.ru. но рабочий, по крайней мере у меня он upload делает... посмотри переменную $base в 60 строке, куда он записывает файлы...
И еще, в этом скрипте нет подтверждения, что upload сделан, он просто возвращается в исходное сотояние, проверь папку в которую должен был производится upload...
-
Ээээ...значит так:
Работающий скрипт upload сеть в ФАКе.
Тему закрыл
Если есть желание обсуждать тонкости разбора multypart/form-data - милости прошу в отдельный тред.