![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Greendrake |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: 1 Всего: 6 |
Хотел написать в одноимённую тему, но её зачем-то закрыли.
Думаю, всё же можно. Задача сводится к тому, чтобы отслеживать увеличение объёма загружаемого файла в директории 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:23 |
|||
|
||||
| -=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: нет Всего: 69 |
Greendrake, на мой взгляд это полная лажа. Я сам когда то хотел таку фичу реализовать, но..... есть одно но, которое меня остановило от этой идеи, PHP серверный язык и ты это прекрасно знаешь, он ничего не знает о клиенте.
Думаю что и не узнаешь. Обосную, из PHP по-любому ты не сможешь узнать размер файла, который клиент хочет закачать еще до того, как php начнет его закачивать. Тут бы пригодился клиентский JS, но безопасность не позволит это сделать. А если ты не сможешь узнать общий размер файла, то ты не сможешь нарисовать прогресс бар, собна вот и все агрументы. -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
| Greendrake |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: 1 Всего: 6 |
Это сообщение отредактировал(а) Greendrake - 16.8.2006, 16:28 |
||||
|
|||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
||||
|
||||
| ewolf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 15.8.2006 Где: г. Москва Репутация: 1 Всего: 18 |
http://google.com/ !
http://sean.treadway.info/demo/upload/ (RUBY) http://tomas.epineer.se/archives/3 Это сообщение отредактировал(а) ewolf - 16.8.2006, 18:55 |
|||
|
||||
| Greendrake |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: 1 Всего: 6 |
Благодарю за ссылки, но, впрочем думаю, это не вызывало сомнений, что сабж можно реализовать с привлечением дополнительных серверных средств, будь то Ruby, Perl или патчи к PHP. Это всё хорошо конечно, но если вся серверная часть проекта написана на PHP, вставлять челюсть на другом языке - довольно криво.
Однако, если с намеченным планом ничего не выйдет, придётся воспользоваться. Это сообщение отредактировал(а) Greendrake - 16.8.2006, 20:07 |
|||
|
||||
| ewolf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 15.8.2006 Где: г. Москва Репутация: 1 Всего: 18 |
Почему дополнительные расширения?
Вот, вроде бы работает без оных http://www.devpro.it/upload_progress/ соответственно JavaScript-часть http://www.devpro.it/code/92.html и php-часть http://www.devpro.it/code/97.html |
|||
|
||||
| Greendrake |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 14.7.2005 Репутация: 1 Всего: 6 |
Гы. Что-ж, это уже ближе к телу, это почти то же самое что я пытаюсь сделать, однако в этом примере
т. е. если сайт будет многопосещаемый и несколько юзеров одновременно начнут грузить файлы, такой прогресс бар станет в ступор В том, что я предлагаю реализовать, это как раз учитывается. |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |