Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 сессии - это и есть инфа для отображения на прогресс баре.

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

Какие будут соображения?
Я попробую реализовать этот алгоритм.

Автор: -=Ustas=- 16.8.2006, 16:23
Greendrake, на мой взгляд это полная лажа. Я сам когда то хотел таку фичу реализовать, но..... есть одно но, которое меня остановило от этой идеи, PHP серверный язык и ты это прекрасно знаешь, он ничего не знает о клиенте.

Цитата(Greendrake @  16.8.2006,  15:41 Найти цитируемый пост)
. к. узнать размер файла до его полной загрузки пока не знаю как

Думаю что и не узнаешь. Обосную, из PHP по-любому ты не сможешь узнать размер файла, который клиент хочет закачать еще до того, как php начнет его закачивать. Тут бы пригодился клиентский JS, но безопасность не позволит это сделать. 
А если ты не сможешь узнать общий размер файла, то ты не сможешь нарисовать прогресс бар, собна вот и все агрументы.

Автор: Greendrake 16.8.2006, 16:27
Цитата
PHP серверный язык и ты это прекрасно знаешь, он ничего не знает о клиенте.
Другими словами, сервер ничего не может узнать о клиенте?  smile 

Цитата
А если ты не сможешь узнать общий размер файла, то ты не сможешь нарисовать прогресс бар, собна вот и все агрументы.
Думаю что абсолютный прогресс бар, показывающий сколько килобойт загружено - уже большое дело. А вопрос с выяснением размера на клиенте с помощью JS будет в будущем решён, не сомневаюсь.

Автор: Mal Hack 16.8.2006, 16:59
Цитата(Greendrake @  16.8.2006,  17:27 Найти цитируемый пост)
А вопрос с выяснением размера на клиенте с помощью JS будет в будущем решён, не сомневаюсь.

Через 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
Цитата
Вот, вроде бы работает без оных
http://www.devpro.it/upload_progress/

Гы. Что-ж, это уже ближе к телу, это почти то же самое что я пытаюсь сделать, однако в этом примере
Цитата
it works probably only with few users at same time because dedicated temporary uploaded file name is really difficult to know

т. е. если сайт будет многопосещаемый и несколько юзеров одновременно начнут грузить файлы, такой прогресс бар станет в ступор smile.
В том, что я предлагаю реализовать, это как раз учитывается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)