LINUX.ORG.RU

[web0.2.0][велосипед] Как сделать аплоад файлов с прогресс-баром?

 


0

0

Да, это есть на многих сайтах. Да, я видел исходники. Где-то перловая обертка для PHP, которая парсит запрос и отдает список файлов основному скрипту, где-то перловый скрипт самостоятельно работает с файлами... И все это идет через штатный CGI.pm, вроде:

1. через хаки подменяем в CGI.pm временную директорию файлов, вызываем new CGI и считаем размер файлов в нашей временной директории по мере аплоада - не люблю использовать недокументированное, чего нет в perldoc CGI

2. самостоятельно читаем весь STDIN в файл - тут размер и так виден, а потом открываем этот файл как STDIN и опять new CGI - двойное отжирание диска

Все это топорно и неконтролируемо. А охота красоты... Т.е. если нам заливает 500 метров непривилегированный юзер - ему показываем 403, если авторизация есть и определенный статус у пользователя - 201. Конечно, можно в Апаче настроить лимиты, но это гибко не сделать, не будешь же для каждого юзера создавать свою директорию со своим htaccess и персональными лимитами. Или, если я вижу, что мне льют avi - сразу обломить закачку, т.е. закрыть соединение. Или, по мере закачки считать md5 заливаемого файла, и если первые 10 метров md5 совпадут с блек-листом - опять обламываем пользователя. Ну это так, желаемое...

Что мне остается? Самостоятельный разбор STDIN - нравится больше всего, но очень уж велосипедно, да и через fast-cgi непонятно как прикрутить (управление получаю только после полного аплоада). Собственно, я бы уже велосипедил, если бы под fast-cgi мог получить запрос до полной заливки. Обычным CGI не хочу.

Появляются странные идеи: взять lighttpd, да добавить парсинг запросов прямо в него, пусть сам проверяет валидность заливаемых данных, считает md5, хранит их хеши в memcached, оттуда же проверяет и блеклист... Но, боюсь, моего красноглазия на это не хватит.

Какие идеи?

а в nginx upload что лучше использовать для приема файлов? бекенд или perl? без них можно как-то ещё?

anonymous
()

В Django уже давненько есть штатные средства для такой вещи. Там всё сделано красиво на аяксе, процессор почти не загружается, память не тратится.

anonymous
()
Ответ на: комментарий от barbuza

> google nginx upload progress и никакого говноperlа на штанах

А на чем быдлокодить, если не на перле? Рекомендуете жабу поизучать?

И чем nginx лучше лайти? Я не доверяю отечественным продуктам

EmStudio
() автор топика
Ответ на: комментарий от provaton

> Мы для таких целей юзаем swfupload

И видим феерические глюки, если пользователь сидит в винде с установленным каспером - полоса загрузки сразу доходит до 100%. Но это только прогресс-бар. А кто мне хеши считать будет, кто в блек-лист пойдет?

Хотя надо будет на 10 флеше сделать - там файлы уже на клиенте читать можно, но это потом, как дополнение.

EmStudio
() автор топика
Ответ на: комментарий от isden

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

EmStudio
() автор топика
Ответ на: комментарий от anonymous

> В Django уже давненько есть штатные средства для такой вещи

Мне много в Django нравится, давно бы использовал, если бы не один досадный баг: отступы строк в коде влияют на работу кода.

EmStudio
() автор топика
Ответ на: комментарий от dimon555

> такое разве бывает?

Имелось в виду на стороне сервера. При обычном аплоаде процессор кушается на 100% и память утекает рекой.

anonymous
()
Ответ на: комментарий от EmStudio

В твоём похапе скобочки влияют на работу кода. Это тоже баг? Так может тебе занятся чем-то по-проще, улицы подметать например?

anonymous
()
Ответ на: комментарий от EmStudio

Говорят, штаны через голову надеть тоже можно. Таких людей обычно либо долго и мучительно переучивают, либо, что более правильно, сразу выбрасывают из проекта, а то и с работы.

anonymous
()
Ответ на: комментарий от anonymous

> Говорят, штаны через голову надеть тоже можно.

Ага. А заливание непонятно чего, непонятных размеров во временную директорию - это что? А контроль типов данных _после_ загрузки - это что? Или как мне хеш посчитать - весь огромный файл перечитывать, поднимая iowait? А черные списки как сделать? Или, еще хуже, парсинг mime прямо в скрипте в бекэнде? Представь, что мне файлики по 500 метров заливают.

> Таких людей обычно либо долго и мучительно переучивают

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

EmStudio
() автор топика
Ответ на: комментарий от anonymous

да, до кучи подскажи: как управлять скоростью заливки? Желательно исходя из прав пользователя, лежащих в бд/мемкеше. А что я настолько тупой, что никак сообразить не могу.

EmStudio
() автор топика
Ответ на: комментарий от anonymous

Пойми, Анонимус, идейно мне джанга нравится (вот тут http://docs.djangoproject.com/en/dev/howto/custom-file-storage/#howto-custom-... прямо готовая обертка для написания драйверов файловых систем - это +1024 к красноглазию), но как только я вижу привычные конструкции БЕЗ скобочек, мой мозг начинает закипать и пениться, поэтому я предпочитаю однострочники на перле. Был бы питон с альтернативным синтаксисом - давно бы использовал жангу и не спрашивал никаких вопросов.

EmStudio
() автор топика
Ответ на: комментарий от EmStudio

Я в таких случаях поступаю очень просто - на зло себе беру и пробую то, что я не понимаю. Очень часто оказывается, что я просто был упёртым оболтусом. Попробуй, очень возможно, что ты получишь хороший инструмент и избавишься от комплексов по поводу отступов.

anonymous
()

Что бы ты ни сделал, все равно у тебя ведь будет какой то фронтэнд? Вот и nginx и lighttpd буферизуют POST запросы, а значит до твоего бекенда они доберуться, когда уже полностью будут залиты на винт сервера.

redbaron ★★
()
Ответ на: комментарий от EmStudio

>И чем nginx лучше лайти? Я не доверяю отечественным продуктам
в данном случае зря.

Effect
()
Ответ на: комментарий от EmStudio

>заливка файлов в nginx, но его я принципиально использовать не буду, с ним и так достаточно проблем


что за проблемы? у меня он уже года 3 живет, и нареканий не было.
а вой lighttpd падал на связке с FCGI сервером, на стресс тесте

Effect
()
Ответ на: комментарий от Effect

>а вой lighttpd падал на связке с FCGI сервером, на стресс тесте

Почему у меня не падает ни на стресс-тестах, ни просто за несколько лет эксплуатации? :)

...

А так, если я правильно понимаю, в Лайти оно есть: http://upload.lighttpd.net/upload.html (собственно, первая же ссылка по http://www.google.ru/search?client=opera&rls=ru&q=lighttpd+upload+pro...)

Надо для теста у себя прикрутить, что ли...

KRoN73 ★★★★★
()
Ответ на: комментарий от redbaron

> а значит до твоего бекенда они доберуться, когда уже полностью будут залиты на винт сервера.

Это точно? Я просто при new CGI::Fast получаю уже готовое окружение и не знаю, где именно происходит заливка данных... Я думал, что как в обычном CGI - все сотни мегабайт на STDIN приходят сразу, по мере поступления от юзера...

Значит я могу больше не искать другие перловые модули, а к моему модулю lighttpd добавлю еще функционала, ибо запрос распарсить не долго.

EmStudio
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.