Сайт о горячих клавишах.





ошибка загрузки файла на сервер








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.20030509232312@localhost/
To: subjex@localhost
Subject: о загрузке файлов на сервак
MIME-Version: 1.0
Content-Type: text/plain; charset=Windows-1251
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

Не нашли нужную информацию, не расстраивайтесь, наберите то что вы ищите в форму для поиска, скорее всего оно уже где-то валяется, и мы легко вам поможем найти это.



Edit

Яндекс.Метрика
jAntivirus