Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/400     18 Aug 2002  12:14:38
 To : Derik
 Subject : Re: multifile upload ?
 -------------------------------------------------------------------------------- 
 
 Здравствуй, Derik.
 
 D> привет Artem Chuprina
 >> D> if ($ENV{'CONTENT_TYPE'} =~ m#^multipart/form-data#) {
 >> D>     if ($ENV{'REQUEST_METHOD'} ne 'POST') {
 >> D>         print "Content-type: text/html;\n\nInvalid request method for
 >> D> multipart/form-data\n"; exit;
 >> D>     }
 >> D>     $blength ||= $ENV{'CONTENT_LENGTH'};
 >> D>     binmode(STDIN); seek(STDIN,0,0);
 >> D>     read(STDIN,$buffer,$blength);
 D> $blength - ограничение вообщето на длинну принятых данных
 
 Тоже мне, ограничение... Ограничением оно было бы, если бы оно не могло быть
 равным нулю и выставляться по $ENV{'CONTENT_LENGTH'}. Суть немного не в том,
 фраза про "если влезет в память" подразумевала, что тебе таки полезно
 прочитать все, что передали. Просто у тебя расход памяти в худшем случае не
 менее чем тройной. Из-за чего, собственно, CGI.pm и складывает принятый файл в
 файл на диске, а не читает в память. Hо это отдельный достаточно узкий вопрос.
 
 >> D>         $header= substr($pairs[$i], 0, $pozition);
 D> > Тут было бы логичнее посплитить $pairs[$i] по \x0d\x0a. Правда, для этого
 D> надо
 D> > знать, что у split бывает более двух параметров...
 D> а смысл ? все же в бинмоде идет на сколько помню и в хэш в том же кладется
 
 Код был бы более удобочитабелен. При том же расходе всего остального.
 
 >> D>           ($cd) = grep (/^\s*Content-Disposition:/i, $header);
 >> D>           ($name) = $cd =~ /\bname="([^"]+)"/i;
 >> D>           ($name) = $cd =~ /\bname=([^\s:;]+)/i unless defined $name;
 >> D>           ($fname) = $cd =~ /\bfilename="([^"]*)"/i;
 >> D>           ($fname) = $cd =~ /\bfilename=([^\s:;]+)/i unless defined
 D> $fname;
 D> >
 D> > А вот : пропускать - это смелый эксперимент... Hекоторые норовят отдать
 D> имя
 D> > файла, начинающееся с C:
 D> ну и фигли ? нас только имя интересует
 
 Hу вот на засыпку: что будет в $fname, если файл отдан с указанием
 filename=C:\autoexec.bat ?
 
 D> > if (ref $in{$name}) {
 D> > push(@{$in{$name}}, $value)
 D> > } else {
 D> > $in{$name} = [$in{$name},$value]
 D> > }
 D> >
 D> > Это помимо того, что решать, массив там или нет, на основании количества
 D> > переданных параметров, мягко говоря, наживание геморроя на собственную
 D> > задницу.
 D> ...а мне нравится :)
 
 Когда такой код публикуешь, будет вежливо предупреждать о подобных аккуратно
 подложенных граблях.
 
 D> ...опять же напомню 1999 год написания этого чуда, а был вопрос , и наверно
 D> я один только кинул кусок кода не задавая глупых вопросов
 
 Hу да. Более мудрые порекомендовали выдрать соответствующий кусок из заведомо
 наличествующего у спрашивающего (бо стандартный) модуля, давно лишенного этих
 граблей и, возможно, пары-тройки других. Хотя надо признать, что твой код
 выгодно отличается от большинства подобных отсутствием ошибок в ДHК и наличием
 всего одной легко поправимой фатальной ошибки.
 
 -- 
 Artem Chuprina
 Communiware.net
 RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757
 --- ifmail v.2.15dev5
  * Origin: Leninsky 45 home network (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: multifile upload ?   Artem Chuprina   18 Aug 2002 12:14:38 
Архивное /ru.perl/14454ea8d01e0.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional