Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закачка файла без модулей, простой Perl простое действие 
:(
    Опции темы
SHAmanovi4
Дата 14.1.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.9.2006
Где: почти мск

Репутация: нет
Всего: нет



Здравствуйте. Не люблю использовать модули без необходимости. Поэтому пишу многое ручками. Скажем, мне удобнее принять переменные руками, написав один foreach, чем заводить new CGI. Так вот. Я хочу узнать, как получить файл (бинарный) на сервере и записать его там. Я выводил тупо весь STDIN на экран. Разобрался со структурой, но почему-то не могу отделить сам файл от заголовка поля smile Посему вопрос: как именно разбирать данные, пришедшие с формы в формате multipart/form-data.

И еще: чтобы сохранить пишу:

Код

open (F, ">>", $name) or die (bla-bla);
binmode F;
print F $file;
close F;


Этого достаточно? Потому что меня терзают смутные сомнения... Не нужно ли еще и читать из STDIN, переведенного в binmode?
PM WWW ICQ   Вверх
Zuzu
Дата 15.1.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 1
Всего: 4



Никогда не разбирал руками STDIN, но один раз пришлось заглянуть, когда один криво настроенный сервер просто не передавал часть параметров из вормы в скрипт.

Видимо,  есть непонимание формата данных, что приходят в STDIN

Есть два варианта.

1. Теоретический: почитать RFC, посвященный CGI - там описан формат потока данных, который потом "попадает в STDIN".
2. Практический: почитать, как это реализовано в CGI.pm


--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
SHAmanovi4
Дата 15.1.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.9.2006
Где: почти мск

Репутация: нет
Всего: нет



Цитата(Zuzu @  15.1.2007,  17:45 Найти цитируемый пост)
почитать RFC, посвященный CGI - там описан формат потока данных, который потом "попадает в STDIN"

Вот этим, видимо, и придется заняться.

Интересно, почему все пользуют CGI.pm? Я понимаю, что удобно иногда, но далеко не всегда ведь! Для вывода html он совершенно излишен, он довольно громоздкий и в нем много того, что не используется вообще или может быть легко заменено обычным кодом. Больше всего поразила функция окончания html, которая просто делает 
print '</body></html>'; Считаю, что этот модуль безусловно хорош, но далеко не всегда. И не понимаю людей, которые подключают всю эту махину только для того, чтобы принять один параметр из $ENV{QUERY_STRING}. Понимаю, что это стандарт уже почти, но все же... К тому же, когда ты сам принимаешь переменную, то ты на 100% отвечаешь за свой код и понимаешь что он делает. И можешь считать сразу в хеш, например. Вот у меня всегда есть хеш %param. Его и писать проще, чем $q->param(). 

Все равно научусь разбирать картинки вручную!


===================
Да еще, расскажите пожалуйста, а для грамотного чтения картинки нужно STDIN переводить в binmode или всетки нет? Чет я не догоняю что же этот binmode делает... уж читал-читал, все равно не понял. Только на уровне ума понял. А на подкожном - нетsmile
PM WWW ICQ   Вверх
ZeeLax
Дата 16.1.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



Цитата(SHAmanovi4 @  16.1.2007,  01:41 Найти цитируемый пост)
Интересно, почему все пользуют CGI.pm?

Чтобы с бубном менше танцевать smile


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Zuzu
Дата 16.1.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 1
Всего: 4



Личто мне ним, c CGI.pm, как-то проще. smile

Что сразу на ум приходит... Параметры рядом и устойчивость форм (в связке c HTML::Template) получается достаточно легко. И все данные (любой фоормы ввода) сохранить в файл. Заголовок (header) свой сделать, не задумываясь о "внутреннем синтаксисе". С куками работа, опять же. 

И по теме. 

Есть люди, которым не нравится CGI.pm и они написали что-то свое.

Если уж так хочется, напиши свой модуль с интрефейсом аналогичным CGI.pm. Затем будет возможность просто менять модули (друг на друга) и смотреть разницу в производительности того и другого при разных ситуациях.
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
JAPH
Дата 16.1.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



SHAmanovi4
Для закачки картинок STDIN должен быть в binmode.
Можно поэксперементировать и посмотреть, что будет в противном случае smile Иногда красиво выглядит

Цитата
отделить сам файл от заголовка поля

Файл начинается сразу после после двух \n\n.
Я, кстати, тоже обхожусь без CGI.PM. Братья по разуму smile
Отрывок:
Код

binmode STDIN; #Без него картинки не читаются
warn "Invalid content length" unless $ENV{'CONTENT_LENGTH'} == read STDIN, my $cont, $ENV{'CONTENT_LENGTH'};
if ($ENV{'CONTENT_TYPE'} =~ /boundary/i) { #Признак, что пришла multipart/form-data
    my ($delim) = $ENV{'CONTENT_TYPE'} =~ /boundary=(.+)/i;
    $delim = "--".$delim; #Тот самый ограничитель ------------itd0
    my @fields = split $delim, $cont;
    foreach (@fields[1 .. @fields - 2]) { #Последнее поле не разбираем - оно содержит хвост ("--"). Нулевое вообще пустое
        my ($n, undef, $v) = /^.*?name=['"]([^'"]+?)['"].*?(\r?)\n\2\n(.*)\2\n$/is; #выбираем параметр и его значение, идущее после пустой строки. Из-за binmode надо учесть \r (или не надо - ?)
        next unless defined $n; #Не помню зачем. Обычно он всегда defined
        addtohash(\%POST, $n, $v) #Функция запоминает пришедшее в хэше, параллельно создавая структуры при n, например, a[0][5]
    }
} else { extract(\%POST, $cont) } #Простой разбор не multipart (не вспомню, как полностью называется [Oops...])

А насчёт сохранения файла полностью согласен - binmode F

Это сообщение отредактировал(а) JAPH - 16.1.2007, 19:39


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
SHAmanovi4
Дата 17.1.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.9.2006
Где: почти мск

Репутация: нет
Всего: нет



Цитата(ZeeLax @  16.1.2007,  15:03 Найти цитируемый пост)
Чтобы с бубном менше танцевать 

Прально, лучше танцевать в танке!

Цитата(Zuzu @  16.1.2007,  15:17 Найти цитируемый пост)
С куками работа, опять же.

Соглашусь, с куками работать с этим модулем проще. Хотя, не всегда опять же, нужно. Больше всего нравится, что можно указывать сколько куке жить, а высчитывается все в самом модуле. Но все равно технологию работы с куками надо знать и без модулей.

Цитата(JAPH @  16.1.2007,  19:33 Найти цитируемый пост)
Братья по разуму 

 smile Спасибо за пример - посмотрю. Просто уже есть куча прог, которые явно требуют загрузки картинок через админку. В частности - галерея изображенийsmile Ну ничего, погодите - ща я разберусь с картинками, и примусь за GD! Мне надо их уменьшать будет smile 
PM WWW ICQ   Вверх
djkostya
Дата 7.2.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.5.2006
Где: Москва

Репутация: 1
Всего: 2



Я даже не знаю почему CGI.pm использую, но точно не для вывода HTML Template Toolkit для этого существуют...
Привычка уже...
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.