Создание индикатора выполнения файла в PHP - PullRequest
5 голосов
/ 01 октября 2008

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

У меня есть одна идея, но я не уверен, сработает ли она: обычная загрузка файлов, но вместо этого отправка в iframe. После отправки сохраните информацию о файле (размер и временное местоположение) в сеансе. В то же время начинайте вызов AJAX каждые 10 секунд, чтобы проверить размер файла по сравнению с размером, сохраненным в сеансе. Это вернет размер в AJAX, и тогда будет отображаться размер индикатора выполнения и, возможно, отобразит загруженный размер пользователю.

Мысли

Ответы [ 9 ]

6 голосов
/ 01 октября 2008

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

Есть обходные пути для этого: Включив APC, вы получите доступ к этой информации, если включите поле с именем «APC_UPLOAD_PROGRESS» и будете использовать apc_fetch () для получения записи кэша со статусом.

Есть также плагин uploadprogress, но он не очень хорошо документирован и не работает в Windows (последний раз я проверял).

Альтернативой является использование Flash для этого. Смотрите сценарии, такие как FancyUpload .

Прежде чем появился APC, мне пришлось написать CGI-скрипт на C, который записывал информацию в текстовый файл. APC кажется гораздо лучшим способом сделать это сейчас.

Надеюсь, это поможет.

5 голосов
/ 01 октября 2008

Пока что наиболее распространенный способ сделать это - SWFUpload: http://www.swfupload.org/

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

Edit: Согласно комментариям на php.net, по состоянию на 5.2 есть ловушка для обработки загрузки. http://us.php.net/features.file-upload#71564

Больше объяснений:

Пример Расмуса:

3 голосов
/ 01 октября 2008

Вы можете попробовать YUI или Прототип или JQuery

1 голос
/ 20 августа 2014

В PHP 5.4 он находится в расширении сеанса: http://php.net//manual/pl/session.upload-progress.php

0 голосов
/ 02 октября 2008

Вам определенно захочется перейти с digitgerald's FancyUpload . Он основан на Mootools и swfuplaod, и в нем есть хорошая очередь со статусами, прогрессом, этапами и т. Д. Это действительно самый приятный способ загрузки файлов. Для моего личного использования ivé использовал его, чтобы позволить клиенту выбрать 1,2 ГБ PDF-файлов и загрузить их. Более новые автоматически переименовываются и версионируются, те же пропускаются и т. Д.

0 голосов
/ 01 октября 2008

Я бы порекомендовал посмотреть SWFUpload , чтобы выполнить то, что вы хотите. Он достаточно гибкий и поддерживает организацию очередей файлов, поэтому вы даже можете загружать несколько файлов.

0 голосов
/ 01 октября 2008

На мой взгляд, лучшее / простое решение - создать небольшой flash-виджет, который состоит из кнопки «Загрузить» и индикатора выполнения. Flash дает вам очень подробные отзывы о том, сколько данных было загружено до сих пор, и вы можете построить хороший индикатор на основе этого. Не требует неэффективного опроса сервера и фактически не требует никаких изменений в коде вашего сервера. Google для «флэш-загрузчик», и вы обнаружите, что многие люди уже написали эти виджеты и рады продать их за доллар.

0 голосов
/ 01 октября 2008

«Старая школа», но PHP + Perl Техника: http://www.raditha.com/php/progress.php

0 голосов
/ 01 октября 2008

В чистом PHP вы правы: это невозможно.

Если вы AJAX-ify это, то вы можете делать то, что вы описываете. Единственные индикаторы прогресса, которые я когда-либо видел, находятся в Javascript или Flash, хотя я полагаю, что Silverlight мог бы сделать это также.

...