Загрузить прогресс бар в PHP
кто-нибудь знает, как получить индикатор выполнения для загрузки в php? Я пытаюсь написать код для загрузчика фотоальбома. Я хотел бы, чтобы индикатор выполнения отображался во время загрузки фотографий.
Я довольно новичок в php, поэтому я не знаю все об этом.
12 ответов:
Это на сегодняшний день (после нескольких часов гуглить и пробовать скрипты) самый простой в настройке и хороший загрузчик я нашел
https://github.com/FineUploader/fine-uploader
Он не требует APC или каких-либо других внешних библиотек PHP, я могу получить обратную связь о прогрессе файла на общем Хосте, и он утверждает, что поддерживает перетаскивание html5 (лично непроверенное) и несколько загрузок файлов.
Мне жаль говорить, что, насколько мне известно, чистый индикатор выполнения загрузки PHP или даже индикатор выполнения загрузки PHP/Javascript невозможен из-за того, как работает PHP. Лучше всего использовать какую-то форму Flash-загрузчика.
AFAIK это связано с тем, что ваш скрипт не выполняется до тех пор, пока не будут заполнены все суперглобалы, включая $_FILES. К моменту вызова PHP-скрипта файл будет полностью загружен.
EDIT:это уже не так. Это было в 2010.
Если у вас APC установлен, он имеет обратный крюк для загрузки прогресса.
Расмус Лердорф (создатель PHP) имеет пример из этого с помощью Юи (О, И вот PHP source).
посмотреть документация здесь.
один PHP-ish (5.2+) & no-Flash способ, который работал хорошо для меня:
во-первых, см. этой сообщение, объясняющее, как получить расширение "uploadprogress" и работает.
затем на странице, содержащей форму, из которой вы загружаете файл(ы), создайте следующий iframe:
<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>
затем добавьте этот код в кнопку" Отправить":
onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"
Теперь у вас есть скрытый iframe в вашей форме, который будет отображаться и показывать содержимое uploadprogress.php при нажатии кнопки "Отправить", чтобы начать загрузку файлов. $upload_id должен быть таким же, что вы используете в качестве значения скрытого поля "UPLOAD_IDENTIFIER" в вашей форме.
uploadprogress.сам php выглядит примерно так (исправить и настроить под свои нужды):
<html> <head> <META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'> </head> <body> Upload progress:<br /> <?php if(!$_GET['id']) die; $info = uploadprogress_get_info($_GET['id']); $kbytes_total = round($info['bytes_total'] / 1024); $kbytes_uploaded = round($info['bytes_uploaded'] / 1024); echo $kbytes_uploaded.'/'.$kbytes_total.' KB'; ?> </body> </html>
обратите внимание, что это самообновляется каждую секунду. Вы можете, конечно, добавить здесь хороший визуальный индикатор выполнения (например, 2 вложенных
s с разными цветами), если хотите. Iframe с прогрессом загрузки естественно, работает только во время загрузки и завершает свою видимую жизнь после отправки формы и перезагрузки браузера на следующую страницу.
реализация индикатора выполнения загрузки проста и не требует дополнительного расширения PHP, JavaScript или Flash. Но нужен PHP 5.4 и новее.
вы должны включить сбор информации о ходе загрузки, установив директиву
session.upload_progress.enabled
доOn
наphp.ini
.затем добавьте скрытый ввод в форму загрузки HTML просто до любые другие входные файлы. В HTML-атрибут
name
этого скрытый ввод должен совпадать со значением директивыsession.upload_progress.name
Сphp.ini
(в конечном итоге предшествуетsession.upload_progress.prefix
). Элементvalue
атрибут зависит от вас, он будет использоваться как часть ключа сеанса.HTML-форма может выглядеть так:
<form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" /> <input type="file" name="file1" /> <input type="submit" /> </form>
когда вы отправляете эту форму, PHP должен создать новый ключ в
$_SESSION
суперглобальная структура, которая будет заполнена информацией о состоянии загрузки. Ключ сцепляетсяname
иvalue
скрытый вход.в PHP вы можете взглянуть на заполненную информацию загрузки:
var_dump($_SESSION[ ini_get('session.upload_progress.prefix') .ini_get('session.upload_progress.name') .'_myupload' ]);
вывод будет выглядеть следующим образом:
$_SESSION["upload_progress_myupload"] = array( "start_time" => 1234567890, // The request time "content_length" => 57343257, // POST content length "bytes_processed" => 54321, // Amount of bytes received and processed "done" => false, // true when the POST handler has finished, successfully or not "files" => array( 0 => array( "field_name" => "file1", // Name of the <input /> field // The following 3 elements equals those in $_FILES "name" => "filename.ext", "tmp_name" => "/tmp/phpxxxxxx", "error" => 0, "done" => false, // True when the POST handler has finished handling this file "start_time" => 1234567890, // When this file has started to be processed "bytes_processed" => 54321, // Number of bytes received and processed for this file ) ) );
есть вся информация, необходимая для создания индикатора выполнения - у вас есть информация, если загрузка все еще продолжается, информация о том, сколько байтов будет передано в общей сложности и сколько байтов уже было передано.
To представьте прогресс загрузки пользователю, напишите другой PHP-скрипт, чем загружаемый, который будет только смотреть на информацию о загрузке в сеансе и возвращать ее, например, в формате JSON. Этот скрипт можно вызывать периодически, например каждую секунду, используя AJAX и информацию, представленную пользователю.
вы даже можете отменить загрузку, установив
$_SESSION[$key]['cancel_upload']
доtrue
.для получения подробной информации, дополнительных настроек и пользователя комментарии руководство PHP.
Я только что нашел Mega Upload (http://www.raditha.com/php/progress.php), который использует perl, выполняет загрузку и отображает индикатор выполнения.
другой загрузчик полный JS : http://developers.sirika.com/mfu/
- его бесплатно (лицензия BSD)
- Internationalizable
- кросс-браузер совместимый
- у вас есть выбор, чтобы установить APC или нет ( underterminate progress bar VS determinate progress bar)
- настраиваемый вид, как он использует механизм шаблона dojo. Вы можете добавить свой класс / идентификаторы в шаблоны te в соответствии с вашим css
удачи
HTML5 представил File upload api это позволяет отслеживать ход загрузки файлов, но для старых браузеров есть plupload фреймворк, специально созданный для мониторинга загрузки файлов и предоставления информации о них. плюс он имеет много обратных вызовов, так что он может работать во всех браузерах
Gears и HTML5 имеют событие прогресса в
HttpRequest
объект для отправки загрузки файла через AJAX.http://developer.mozilla.org/en/Using_files_from_web_applications
ваши другие варианты, как уже ответили другие:
- загрузчик на основе Flash.
- загрузчик на основе Java.
- второй в стиле кометы запрос на веб-сервер или скрипт, чтобы сообщить размер полученных данных. Некоторые веб-серверы, такие как Lighttpd, предоставляют модули для этого в процессе, чтобы сэкономить накладные расходы на вызов внешнего скрипта или процесса.
технически есть четвертый вариант, похожий на загрузку YouTube, с Gears или HTML5 вы можете использовать blobs для разделения файла на небольшие куски и индивидуальной загрузки каждого куска. По завершении каждого фрагмента вы можете обновить статус выполнения.
вам нужно будет использовать Javascript для создания индикатора выполнения. Простой поиск Google привел меня к этой статье:WebAppers простой Javascript прогресс бар с CSS.
Dojo Файл Загрузить Прогресс Бар Виджет - это еще один вариант использования платформы Dojo Javascript.
EDIT: предполагая, что вы загружаете большое количество изображений (например, фотоальбом) и размещаете их в своем PHP-скрипте, вы можете использовать javascript для чтения результатов сообщение и обновление индикатора выполнения на основе количества загруженных изображений / общее количество изображений. Это имеет побочный эффект только обновления после завершения каждой должности. Проверьте здесь для получения некоторой информации о том, как разместить с JS.
индикатор выполнения php / ajax может быть выполнен. (Проверьте библиотеку Html_Ajax в pear). Однако это требует установки пользовательского модуля в php.
другие методы требуют использования iframe, через который php смотрит, сколько файлов было загружено. Однако этот скрытый iframe может быть заблокирован некоторыми дополнениями браузеров, потому что скрытые iframes часто используются для отправки вредоносных данных на компьютер пользователя.
лучше всего использовать какую-то форму индикатора выполнения вспышки если у вас нет контроля над вашим сервером.
Flash загрузка будет делать эту работу. она будет загружать файл, где вы хотите. Но для меня есть и другие требования. мне нужно изменить имя файла до завершения загрузки. это также возможно с флэш-решением, но только если вы добавляете фиксированную переменную. Мне нужно добавить идентификатор пользователя в имя файла, и я не вижу способа сделать это.