Сайт о горячих клавишах.
ошибка загрузки файла на серверReceived: from jkeks@localhost (localhost [127.0.0.1]) Fri, 9 May 2003 18:48:05 GMT Date: Fri, 9 May 2003 23:23:12 +0600 From: localhost /jkeks@localhost/ X-Mailer: The Bat! (v1.62/Beta6) Reply-To: localhost /jkeks@localhost/ X-Priority: 3 (Normal) Message-ID: /1528371084.@localhost/ To: subjex@localhost Subject: о загрузке файлов на сервак MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Проблема более чем актуальная.. Я просто уже месяца 2 мучаюсь тем каким образом это организовать, и собственно говоря потратил кучу времени на написание универсального модуля. Модуль уже правильно дергает боле менее стандартные mime запросы. Но до окончания работы необходимо еще очень много времени. Поэтому и поэтому я взялся за готовые решения. Итак небольшой обзор популярных решений. 1. CGI.pm Самый надежный выбор, думаю проблем никогда не возникнет особых. Доступ к полученным файлам осуществляется через объекты. Пример использования следующий: $filename = $query-/param(`uploaded_file'); while (/$filename/) { print; } В чем минусы данного решения: Огромный CGI.pm 214.690 байт кроме того подключаются еще CGI:Carp CGI:Util и еще по мелочи. Поверьте, обработка всего лишь входящих данных не требует такого объема кода. На самом деле не более 3к надо-то чистого кода. К тому же в самом CGI.pm много того что в принципе просто напросто не нужно. Большинство. 2. cgi-lib Данный вариант появился как я понял раньше чем CGI.pm, хотя не утверждаю. В CGI.pm сделали поддержку кода написанного для cgi-lib.pl Поэтому код написанный для последнего, требует минимум изменений (изменение имени подключаемой библиотеки) для правильной работы. В содуле же cgi-lib обработка происходит по вызову функции ReadParse Библиотека занимает около 15 килобайт, и подключается древним методом require Что мене не понравилось это - слегка запутанная документация. Я с трудом понял как что вызывать. Да и теперь уже забыл 10 раз. 3. WebIn Отечественный проект WebIn очень хорош и документирован неплохо. Модуль занимает 11 кило, но.. модуль использует еще один свой модуль Tools а внутренние функции при необходимости подключают еще некоторые модули навроде Path. Получается что все взаимосвязано и использовать лишь WebIn не удастся. К плюсам можно отнести то что часть кода скомпилировано на C. т.е.Критично важные для быстродействия функции выполняются шустро. Проект группы dklab выигрывает всех буржуев по очкам 8\ Но жаль что все это не то, мне необходима лишь элементарная функция получения файла и данных форм с минимизацией Глюков и размера кода. Смотрим дальше.. 4. CGI-Lite самый подходящий вариант. Всего один модуль с отличной документацией и примерами использования. Код правда занимает 26 кило, нужно участь что в нем же вшита и вся документация (без примеров) Минусом является то что нет возможности получать файлы не через файл, а через скаляр.( к чему я стремился) Но вообще этот вариант понравился мне больше всего. 5. Самопальные методы. В большинстве случаев подобные варианты будут работать нормально, но все же необходимо расширить возможности.. Например IE передает имя файла с Путем но машине пользователя передающего файл, CGI_Lite режет этот путь (он нахрен не нужен) Одним из примеров приводимых на xpoint является следующий: $boundary) = $ENV{CONTENT_TYPE} =~ /boundary=(\S+)$/; read (STDIN,$buffer, $ENV{'CONTENT_LENGTH'}); while ($buffer ne '') { if ($buffer =~ /(?:5?2)?-+$boundary-*[52]*/) {($old_data, $store) = ($', $`);}; ($field) = $store =~ /name="([\]+)"/; if ($field eq '') {$buffer=$old_data;next;}; if (($file) = $store =~ /filename="(.*)"/) { $store =~ s/(.+)?((\n)?(\r)?){2}(.+)((\n)?(\r)?){2}?//; $cellname=$field."content"; $FORMNAMES{$cellname}=$store; $FORMNAMES{$field}=$file; } else { $store =~ s/(.+)?((\n)?(\r)?){2}//; $FORMNAMES{$field}=$';}; $buffer=$old_data; }; красиво не правда ли ? Ну и дак вот. Сам я отталкивался именно от этого варианта, но мой вариант немного изменен. Существуют еще наверняка более мелкие проекты, о которых я так ничего и не смог достать. Насколько важно получать приходящий файл в скаляр или файл ? Ответить сложно.. я хотел получать все в скаляр, но учитывая, что это как минимум около 500к - 1мб, все же вернее будет получать лишь дескриптор. На счет дыр в подобных вещах.. что-то слышал на securitylab про CGI_Lite дыры были.. в других реализациях ничего не знаю. Вот и посудите... теперь что где брать ? CGI.pm - в стандартной поставке с Перлом с Версии 5.0хх идет однозначно. cgi-lib - http://cgi-lib.berkley.edu/cgi-lib/ WebIn - dklab.ru CGI_Lite - нужно искать на CPAN.ORG Примеры и какие-то наработки можете искать на xpoint.ru - кстати один из самых хороших наших форумов, где реально помогают. Если бы у меня было много времени я бы дописал свой проект, но.. по иному приходится все склоняться к CGI_Lite
|