|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/14454ea8d01e0.html, оценка из 5, голосов 10
|