Pull to refresh

Comments 83

Думаю неплохо было бы привести здесь листинги реализации. Зачем заставлять народ лазить по ссылкам)
на крайний случай в какойнибуть paste сервис с человеческой подсветкой :)
у вас ффокс неподсвечивает?
нет, особенно если выдача уже попорчена :)
Если перед вашим Апачом будет стоять reverse-proxy (тот же nginx), то он сначала дождется загрузки формы в свой кэш, а только потом отдаст данные формы Апачу. В итоге пользователь увидит только два положения прогресс-бара - сначала 0%, а потом сразу 100%.
Найти хостинг, у которого Апач сразу смотрит "наружу", сейчас практически невозможно. Так что вышеприведенное решение имеет крайне сомнительную практическую ценность.
Ну у меня свой сервер, и у многих здесь я думаю.
на своем сервере для уменьшения нагрузки грех не поставить что-нибудь полегче на отдачу статики :)
А допустим такая картина. Человек нажал на кнопочку, запустился аджакс с отображением процентов такого то файла, и отправилась сама форма. Аджакс в цикле изредка проверяет сколько загрузилось и выводит инфу об этом.
Для nginx есть специальный заголовок, отключающий буферизацию. Я просил Игоря его сделать как раз для этих целей.
Можно поподробнее?
В архивах рассылки nginx-ru есть. X-Accel-что-то-там
Если вы про X-Accel-Buffering, то он отключает буферизацию ответа бэкенда, но никак не влияет на буферизацию запроса от клиента.
Ага, значит, я неверно понял задачу.
В архивах рассылки nginx-ru есть. X-Accel-что-то-там
Относительно недавно в ru-nginx было обсуждение этого вопроса, и решения так и не нашлось. Что за заголовок?
X-Accel-что-то-там, в архивах есть.
Клево. Нечто подобное видел на новом стартапе weborama, там при закачке файла на этот сайт в title показывается сколько уже загружено (очень удобно).
Мы для этого расширения php не ставили
Подскажите, как это можно сделать без php extensions
не первый раз вижу такую вот картинку с APC
а где автор взял такое???

apc_cache_info() выдает просто массив
в комплекте к apc идет файлик php который запускаеш и он показывает вот эту статистику, а если apc неустановился то покажет ошибку.
По поиску apc.rfc1867 находятся в основном багрепорты :-/

Мы для себя писали extension (+ патч на сорцы PHP), который хранит это дело в memcached вместо shared memory. Стабильненько работает на файлхостинге с Alexa Rank 700.
Кому нужно - обращайтесь. Может быть даже найдем время опубликовать.
а без патча на сырцы PHP никак??
сам по себе extension собирается под чем нибудь??

было бы классно если бы опубликовали и стали поддерживать
Патч нужен только для 5.1.2 (если не ошибаюсь) и ниже. Стало быть опубликуем на неделе.
где примерно хотя бы искать???? вы на nginx related подписаны?
Хм, я думал это на JS сплошняком реализовано... А так - слишком сыро пока.
Вся магия данного примера заключается в единственной строке
apc.rfc1867=On

RFC1867 File Upload Progress hook handler is only available if you compiled APC against PHP 5.2.0 or later. When enabled, any file uploads which includes a field called APC_UPLOAD_PROGRESS before the file field in an upload form will cause APC to automatically create an upload_key user cache entry where key is the value of the APC_UPLOAD_PROGRESS form entry.

Для более детальной настройки существуют еще параметры
apc.rfc1867 (указан выше)
apc.rfc1867_prefix
apc.rfc1867_name
apc.rfc1867_freq

А вообще все есть тут (http://ru2.php.net/manual/en/ref.apc.php)
Перед тем как читать - попробовал Ваш "Рабочий пример". Какого бы объема файл не скармливал - аплоадер тупит одинаково. Долго думает, потом дергается сразу на 100%, правда в процессе показывает как он проходит некую промежуточную стадию. За доли секунды)
Плохой аплоадер, неудачный пример и выбран плохой метод (через установку расширений). Задачу "развлечь" пользователя в процессе загрузки можно решить более тривиально, анимированным гифом.
Ну так надо было сначала почитать, настроить сервер как нужно и потом уже пробывать пример тогда бы не удивлялись что у вас что-то "нерабоатет" !
так демо по ссылке http://php5.bluga.net/UploadProgressMeter/demo.php не работает. При чем тут сервер?
у меня всё работает в ффоксе и ие. вы файл то какого размера грузите.
Втречный вопрос, а какого надо?
я пробовал небольшие, килобайт по 100 и мегабайтный файл.
ну зависит от вашей скорости, там период старта пару секунд. если вы за пару секунд этот файл успеваете загрузить то ничего неувидите. вам вообще этот аплоалер непонядобился бы вы ведь не ждёте. аплоадер нужен для больших файлов.
Попробовал 16 мб, примерно через 2 секунды - 100% и дальше крутит.
ФФ2, вин XP. Скорость конечно хорошая, но не настолько)
Мне в принципе всё равно, пользоваться Вашим не буду. Мутулзовский аплоадер радует (не градусником, а возможность много файлов загрузить http://digitarald.de/playground/uplooad.html )
Любого, от 100 кб, до 5 метров. Сразу 100% пишет.

P.S. Начинать фразу со слов "У меня все работает" - дурной тон.
у всех кому я давал ссылку работало и под убунтой и под виндоусом
Тоже не работает: тестировал в Firefox 2, Opera 9.52 и IE6. В первом же ответе от сервера приходит статус "готово" и индикатор переходит на 100%. При этом файл продолжает загружаться.

Есть ощущение, что вчера оно работало. Возможно, из-за большого количества желающих потестить возросла нагрузка на сервер и фичу отключили...
действительно Ваше демо не работает для любых размеров файлов. Загрузка файла идет, а основной фичи - вывода информации о проценте загружаемого файла нет. Ваш скрипт сразу выдает 100%.
у меня тоже не сработало.
файл в 9 мегабайт в опере - сразу показал 100% (а внизу, уже опера где показывает, в статусе - шла заливка - 400 Кб, 500 кб.. и т.д)
привет.
дублирую сюда свой коммент к последнему посту из раздела стартапов. надеюсь на понимание.
у меня есть интересная идея для стартапа, но я тут недавно, и не совсем разобрался, как сюда постить. Как я понял - нужно карму больше нуля, чтобы хотя бы в личный блог писать. Это я выяснил из местной вики. А теперь к делу.
Идея - социальная сеть файлообмена. нужен ли такой сервис рунету? есть куча мыслей по этому поводу.
Пожалуйста, добавьте мне хоть немного кармы - чтобы я мог об этом хотя бы в личный блог написать.
Очень хочется услышать адекватные мнения по поводу моей идеи.
Заранее спасибо :)
социальная сеть файлообмена это торрент или нет
нет, это не торрент.
вобщем-то есть уже подобний аплоадер... написан на содействии Flash/mootools . Его можно увидеть в Joomla 1.5 ( J! API: JHTML::_('behaviour.uploader') )...
Прочитал статью. К чему такие сложности?
Не проще ли поставить: http://pecl.php.net/package/uploadprogress. И аяксом (например JsHttpRequest) получать информацию о статусе файла.
Подробнее можно прочитать здесь: http://phpdevils.com/blog/development/php/php-extension-uploadprogress
Куда более компактный вариант.
Проще реализовать аплоадер на флеше, не трогая серверную сторону (подробнее ).
Правда, там есть бодяга одна с загрузками очень больших файлов (десятки мегабайт): через какое-то время флеш-плеер выдает алерт, что скрипт слишком нагружает комп и предлагает его остановить. Мы решили проблему так - для очень больших файлов перманентно убивали обработчик события onProgress, восстанавливая его ежесекундно, помогло :)
UFO landed and left these words here
UFO landed and left these words here
Ну вроде работает замечательно, планируем тестить под нагрузкой
ждём результатов
UFO landed and left these words here
UFO landed and left these words here
Вообще server-side аплоад прогресс меттер имеет 1 недостаток, а именно, для 1 обновления нужно делать 1 запрос. И получается очень много ресурсов сервера уходит тупо на аплоадпрогресс меттер, особенно если запросы апач обрабатывает. ИМХО, если и нужно показывать пользователям прогресс меттер, то лучше испольщовать для этих целей Flash. И никакого server-side.

P.S. У прогресс меттера в PHP APC есть большой недостаток, данные об аплоаде хранятся на том же сервере куда и происходит аплоад. Тоесть если у вас есть основной сервер и отдельно файлопомойка, куда вы льете файлы. то приходится извращаться.
Самые лучшие решения это конечно через flash, но если нет такого желания то можно использовать JavaScript + Ajax + CGI
UFO landed and left these words here
При небольшом трафике это допустимо. Но когда на сервер заливается одновременно сотни файлов, то хранение статистике в файле и на каждое ее обновление нужно делать чтение файла.. это положит дисковую подсистему в момент. :-)
UFO landed and left these words here
Даже при сотнях, зачем лишний раз обращатся к дисковой подсистеме, если можно тем же перлом писать в тот же шаредмем или мемкаш и из php это читать?

P.S. я так уже делал в проекте с невысоким load. Обновлял прогрессбар каждые 0.5-1 секунду. работало как часы. При этом никакой дополнительной нагрузки на Дисковую...
У меня "Рабочий пример" работает неправильно:
1. В опере в процессе аплоада файла все время светится Connecting, а только после окончания появляется "Upload complete".
2. В фоксе сразу появляется "Upload complete", а потом догружается файл на сервер.
Напомню, что длинный геморрой с прогрессом аплоада идет исключительно оттого, что среди всех популярных браузеров только один умеет нормально показывать сколько байт загрузилось. (И то, с последних версий, нужно в скине включить "расширенный" прогресбар.) Это Опера, около 3% рынка веб-браузеров. Думаю, у 10% пользователей Оперы включен этот прогресбар (выпадающий снизу, а не внутри адресной строки). Таким образом, около 0,3% пользователей веба осчастливлены нормальной (а не перректально-аяксовой) информацией о загрузке файла.

Мне тоже пришлось реализовать аяксовый трекер (с помощью модуля к nginx), который успешно работает. Чтобы скрасить горечь от бессмысленности этого деяния (в масштабах мировой революции, конечно), оформил закачку красиво, с человеческим "осталось меньше минуты" или "осталось 24 секунды".

Вопрос знатокам: когда файерфокс и вебкит (сафари) научатся сами ("из первых рук") делиться с пользователем информацией о закачке файла тяжелее 512 Кб?
как только - так сразу. Возможно к тому времени уже будет популярен трехмерный интернет и гипертекстовый фидонет.

я бы еще добавил возможность закачивать папки и группы файлов. А также избавился бы от стандартного поля для ввода файла, сделав вместо него некую функцию, что открывала бы диалог выбора файла (который сразу бы отправлялся на сервер)
Нужно всего лишь: <input type="file" multiple="multiple" name="user_file[]" />, а ось должна разрешить выбрать сразу кучку файлов.
мм.... возможно. Я не пробовал.
Но папки оно все равно не позволит загружать.
И никуда от некрасивого поля для ввода этих файлов не деться.
Оно не работает =) Это мое предложение браузерописателям.
Папки закачивать, конечно, классно, но даже простая заливка массива файлов уже сильно облегчит жизнь во многих ситуациях. Папки, кстати, тоже можно заливать без серьезных хирургических операций. Сервер разберется кто где лежит по префиксам в original file name (которое будет включать в себя относительный путь от залитой папки).

А красота - вещь относительная. На макоси поле вполне красивое и стандартный диалог выбора файла очень удобный (не в пример сами знаете чему).
возможно. но когда разработчик не может задать даже текст на кнопке выборе файла или сделать загрузку "в два клика", становится грустно.

В частности если бы был некая функция loadFile в JS, то можно былобы сделать нечто вроде <div onclick="window.loadFile()" style="cursor:pointer"> по аналогии с функцией print()

И так уже все фотохостинги мучаются, извращась с загрузкой.
Единственное, с чем мучаются фотохостинги - это невозможность легко и быстро залить с десяток файлов. Возможность поменять текст на кнопке или сделать нечто аксовое в два клика - дело десятое. Я бы с удовольствием пользовался стандартным интерфейсом Basic HTTP Auth (не нужно мутить свои формы, не нужно бороться с кражей куков), если бы в браузерах наравне с кнопками "вперед" и "назад" была всем понятная кнопка "выйти". Т.к. basic auth прерывает сессию только при закрытии окна браузера. Для многотабовых программ или kiosk-mode это не катит.

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

почему же сразу фиолетовый? Иногда дизайнерам приходится экономить место. в случае с загрзкой файла эту кнопочку не сделать 16 на 16 пикселей. В отличие от форм входа-выхода.
У меня на столе лежит айпод с монитором 200 ppi, а передо мной - большой экран 98 ppi. Думаю, году в 2010 эппл разродится экраном, как минимум, 150 ppi. И заодно дополирует свой resolution independent API в макоси. О каких 16*16 пикселях может идти речь, как в них целиться? Если не хватает места, нужно выкидывать лишние элементы интерфейса, делать его более сфокусированным. Многослойным, если требуется.

Важные кнопки должны быть большие и красивые, а неважные просто не должы быть.
хорошо. БОЛЬШУЮ кнопку для загрузки файла тоже не сделать. Она в любом случае нынче только одного вида есть :)
Мы о чем спорим? Моя позиция такова: использовать как можно больше стандартных вещей, поменьше изобретать велосипед и фокусироваться на сути, а не тесёмочках. Мне стандартное поле ввода файла удобно всем, кроме отсутствия опции multiple. Стандартные текстовые поля, кнопки стандартного внешнего вида - всё меня устраивает. Для классного аяксового интерфейса нужно не размеры кнопочек подбирать, а тщательно прорабатывать сценарий взаимодействия пользователя с компьютером. Less is more и все дела.
все это замечательно. Только если я, как дизайнер, захочу сделать несколько нестандартно, дабы подчеркнуть какую-либо идею, то в отличие от всех остальных кнопочек, что настраиваются _стандартными_ средствами, я не смогу сделать ничего. Моя позиция такова, что в случае с полем ввода файла, оно не должно выглядеть только так, как задумали разработчики браузера. Должно быть какое-то событие для загрузи файла через дом.
Ты прав в том, что поле загрузки файла должно настраиваться так же, как и остальные поля. Без дискриминации. Да, это так. Загрузка через ДОМ - это тоже отлично и полезно. Но это все вкусности, которые в разных браузерах требуют некоторых сложных изменений. Мне же нужна всего лишь простая, но важная функциональность, которую добавить довольно просто в любой из современных браузеров. Причем, эта функциональность будет совместима с существующими приложениями и протоколом HTTP 1.1.

Вот когда добавят необходимые для щастья 50-200 лишних строк кода на Си (Си++ или ObjC) для опции multiple, тогда пусть и придумывают API для джаваскрипта.
мне кажется или мы просто говорим об одном и том-же, натягивая одеяло каждый сам на себя. Я вот привык работать с сайтами через дом. И для меня подобное поле проще нарисовать через document.createElement('input'), нежели нвписать <input>

Эта функциональность не позволит получить управление загрузкой в свои руки. т.е. возможна ситуация, что пока все 100+ файлов не загрузятся - серверный скрипт не отработает. Если выдавать серверу файлу в порядке очередности через JS, то ситуация будет более радужной.
1) Очень несогласен: "для меня подобное поле проще нарисовать через document.createElement('input'), нежели нвписать "

2) Очень согласен: "Если выдавать серверу файлу в порядке очередности через JS, то ситуация будет более радужной."


Вот и вся разница в наших рассуждениях этим зимним вечером =)
1. а почему?

2. :)

да. пора домой. :)
потому что less is more. Я уже сполна затрахался с аяксом и как пользователь, и как разработчик. Тем, кто еще нет, действительно проще написать скрипт, чем один тег =)
да... это дело у нас в крови :)
для меня не будет полезной, к сожалению, нигде не смогу применить (нет желания нагружать лишним)
думаю, не только для меня...
Only those users with full accounts are able to leave comments. Log in, please.