|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Artem Chuprina 2:5020/400 26 Nov 2002 17:30:03 To : Artem Mikhailov Subject : Re: post files -------------------------------------------------------------------------------- .ru> <slrnau4iih.fe4.ran@banquet.lan.ice.ru> .ru> <a6n4uus19ugd6p9fljj53o65497utge74c@4ax.com> From: Artem Chuprina <ran@ice.ru> Здравствуй, Artem Mikhailov. AM> >В том и фокус, что если там просто не загружен файл, то это будет "просто AM> >какая-то параметра". С другой стороны, если файл не загружен, то чем это AM> >поле не какая-то параметра с пустым телом? AM> с одной стороны, действительно, ничего криминального. но у с другой, AM> так как в html вывести поле с типом file с заранее определенным value AM> - как может сделать любая другая "параметра" - нельзя, то становится AM> невозможным писать общие классы обработки всех данных форм. не AM> работает стандратная парадигма увидел/изменил/сохранил данные в форме, AM> выведенной с текущими сохраненными в прошлой рабочей сессии AM> значениями, если там есть тип file. Hу так это невозможно на уровне клиента. AM> для всех остальных типов работает некий - не бейте за умные слова - AM> паттерн: AM> foreach (param()) { AM> if (param($_)) { mark for save... } AM> else { mark for save as undef or default in rdbm... } AM> } AM> при попадании в этот оборот file, вне зависимости от того, храним ли AM> мы ссылку или все тело аплоада в репозитарии, нам необходимо AM> распараллелить процесс: AM> foreach (param()) { AM> if (upload($_)) { do upload, mark for save... } (1) AM> elsif (param($_)) { mark for save... } (2) AM> else { mark for save as undef or default in rdbm... } (3) AM> } AM> и штука в том, что при "неаплоаде" мы неприменно свалимся в (3) и AM> сохраним undef, default или что там у нас есть в (3) как обработчик. AM> он не знает, и ему никак не сказать, что "файла нет, оставь старый AM> линк|тело". нет функции: AM> (1) AM> elsif (not_uploaded($_)) { leave it... } (2a) AM> (3) То есть логика для обычных параметров и аплоадов у тебя разная? Так и надо говорить. AM> если бы "неаплоаденный" файл автоматом бы выключался бы из param(), AM> это было бы здорово. но он там есть. как undef. AM> в принципе, можно для каждого param($_) исполнять свой запрос на AM> репозитарий, если оно defined, а если оно и defined(upload($_)), то AM> еще и do upload. но это опять же, имхо, тот же нелепый хак, что и про AM> имена полей/параметров. делать 50 запросов вместо одного? так AM> неправильно. можно, в принципе, еще напридумывать хаков, например, со AM> скрытыми полями формы. но я считаю, что нужно продумать над (2a). if (param("__file_$_")) { if (upload($_)) { mark for save... } else { leave... } } elsif (/^__file_/) { next } else { if (param($_)) { mark for save... } else { mark for save as undef or default in rdbm... } } Раз уж у тебя разная логика для параметра, который upload и параметра, который не upload, разным кодом ее и реализуй. И озаботься тем, чтобы форма содержала метки "такой-то параметр - upload". Ибо никакой стандарт не обещал тебе, что браузер будет передавать пустое значение для upload field - он имеет право его не передавать вообще. -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/1445404530b59.html, оценка из 5, голосов 10
|