Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Статус загрузки файла на сервер, мозговой штурм 
:(
    Опции темы
Greendrake
Дата 16.8.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
-=Ustas=-
Дата 16.8.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



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

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

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


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Greendrake
Дата 16.8.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: 1
Всего: 6



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

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

Это сообщение отредактировал(а) Greendrake - 16.8.2006, 16:28
PM MAIL   Вверх
Mal Hack
Дата 16.8.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



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

Через JS он решен не будет 100%. Можешь капнуть в сторону Java Applet.
PM ICQ   Вверх
ewolf
Дата 16.8.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Greendrake
Дата 16.8.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: 1
Всего: 6



Благодарю за ссылки, но, впрочем думаю, это не вызывало сомнений, что сабж можно реализовать с привлечением дополнительных серверных средств, будь то Ruby, Perl или патчи к PHP. Это всё хорошо конечно, но если вся серверная часть проекта написана на PHP, вставлять челюсть на другом языке - довольно криво.
Однако, если с намеченным планом ничего не выйдет, придётся воспользоваться.

Это сообщение отредактировал(а) Greendrake - 16.8.2006, 20:07
PM MAIL   Вверх
ewolf
Дата 17.8.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Greendrake
Дата 17.8.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: 1
Всего: 6



Цитата
Вот, вроде бы работает без оных
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.
В том, что я предлагаю реализовать, это как раз учитывается.
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.