| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > Статус загрузки файла на сервер |
| Автор: Greendrake 16.8.2006, 15:41 | ||
Хотел написать в http://forum.vingrad.ru/index.php?showtopic=96743, но её зачем-то закрыли.
Думаю, всё же можно. Задача сводится к тому, чтобы отслеживать увеличение объёма загружаемого файла в директории upload_tmp_dir. Тогда можно было бы на страничке забубенить ajaxовый блок, то и дело опрашивающий на сервере специальный php-скрипт, следящий за размером загружаемого файла. Проблема в том, что мы не знаем, как этот файл называется. PHP называет его случайным образом, и хранит об этом молчание до тех пор, пока не примет весь файл. Первое что мне пришло в голову, это изменять значение upload_tmp_dir на специально создаваемую папку, имеющую в составе своего имени ID сессии. Тогда каждый файл грузился бы в разные папки, и скрипты в пределах одной сессии знали бы куда именно. Да вот загвоздка - параметр upload_tmp_dir награждён атрибутом PHP_INI_SYSTEM, то есть менять его можно только в php.ini или httpd.conf, но никак не в .htaccess и уж тем более никак с помощью ini_set(). Поскольку аплоад всё-же придётся делать в одну папку для всех, нужно решить задачу - как определить, который именно из файлов, находящихся в папке upload_tmp_dir грузится с нашей странички. Думаю это можно делать следующим образом: на сервере будем вести учёт всех файлов, загружаемых в данный момент (допустим, создадим для этого таблицу в БД). Примерный алгоритм следующий: 1. При нажатии submit на форме, сначала отправляется специальный ajaxовый запрос на скрипт учёта - запрос на разрешение начать аплоад. Он передаёт количество и имена файлов. Если разрешение получено - сабмитится основная форма, если нет, запрос повторяется снова скажем через 1 с, и т. д. 2. Скрипт учёта следит за тем, чтобы все файлы, находящиеся в данный момент в папке upload_tmp_dir и начинающиеся на php (т. е. загружающиеся), были занесены в таблицу учёта, где им сопоставляются ID сессий. Отдав разрешение на аплоад, скрипт периодически сканирует папку upload_tmp_dir, и заносит появляющиеся в ней файлы в таблицу, сопоставляя им ID сессии. Занеся все файлы, скрипт готов отдать следующее разрешение, и т. д. 3. Другой скрипт (или этот же - не суть) периодически сообщает о размерах файлов, соответствующих необходимому ID сессии - это и есть инфа для отображения на прогресс баре. Единственное - такой бар будет показывать абсолютное значение загруженной инфы, т. к. узнать размер файла до его полной загрузки пока не знаю как. Какие будут соображения? Я попробую реализовать этот алгоритм. |
| Автор: Greendrake 16.8.2006, 16:27 | ||||
|
| Автор: Mal Hack 16.8.2006, 16:59 | ||
Через JS он решен не будет 100%. Можешь капнуть в сторону Java Applet. |
| Автор: ewolf 16.8.2006, 18:46 |
| http://google.com/ ! http://sean.treadway.info/demo/upload/ (RUBY) http://tomas.epineer.se/archives/3 |
| Автор: Greendrake 16.8.2006, 20:05 |
| Благодарю за ссылки, но, впрочем думаю, это не вызывало сомнений, что сабж можно реализовать с привлечением дополнительных серверных средств, будь то Ruby, Perl или патчи к PHP. Это всё хорошо конечно, но если вся серверная часть проекта написана на PHP, вставлять челюсть на другом языке - довольно криво. Однако, если с намеченным планом ничего не выйдет, придётся воспользоваться. |
| Автор: ewolf 17.8.2006, 01:19 |
| Почему дополнительные расширения? Вот, вроде бы работает без оных http://www.devpro.it/upload_progress/ соответственно JavaScript-часть http://www.devpro.it/code/92.html и php-часть http://www.devpro.it/code/97.html |
| Автор: Greendrake 17.8.2006, 08:51 | ||||
Гы. Что-ж, это уже ближе к телу, это почти то же самое что я пытаюсь сделать, однако в этом примере
т. е. если сайт будет многопосещаемый и несколько юзеров одновременно начнут грузить файлы, такой прогресс бар станет в ступор В том, что я предлагаю реализовать, это как раз учитывается. |