Загрузить панель выполнения в PHP

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

Я довольно новичок в php, поэтому я не знаю все об этом.

Это далеко (после нескольких часов работы с ошибками и скриптов) самый простой в настройке и самый красивый загрузчик, который я нашел

https://github.com/FineUploader/fine-uploader

Он не требует APC или каких-либо других внешних библиотек PHP, я могу получить обратную связь с прогрессом на общем хосте, и он утверждает, что поддерживает перетаскивание html5 (лично непроверено) и несколько загрузок файлов.

Мне жаль говорить, что, насколько мне известно, чистый график выполнения загрузки PHP или даже индикатор выполнения загрузки PHP / Javascript невозможен из-за того, как работает PHP. Лучше всего использовать какую-либо форму Flash-загрузчика.

AFAIK Это потому, что ваш скрипт не выполняется до тех пор, пока не будут заполнены все суперглобалы, которые включают $ _FILES. К моменту запуска вашего PHP-скрипта файл полностью загружается.

EDIT: Это уже не так. Это было в 2010 году.

Если у вас установлен APC , у него есть обратный вызов для загрузки.

Rasmus Lerdorf (создатель PHP) имеет образец этого использования с использованием YUI (ах, и вот источник PHP ).

См. Документацию здесь .

Один способ 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, когда вы нажмете «Submit», чтобы начать загрузку файлов. $ 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 вложенных <div> s с разными цветами), если хотите. IFrame с загрузкой, естественно, работает только во время загрузки, и заканчивает свою видимую жизнь после отправки формы и перезагрузки браузера на следующую страницу.

Реализация контрольной панели загрузки проста и не требует дополнительного расширения PHP, JavaScript или Flash. Но вам нужен PHP 5.4 и новее .

Вы должны включить сбор информации о ходе загрузки, установив директиву session.upload_progress.enabled в On в php.ini .

Затем добавьте скрытый ввод в форму загрузки HTML непосредственно перед любыми другими входами файлов. name атрибута HTML этого скрытого ввода должно быть таким же, как значение директивы 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 ) ) ); 

Существует вся информация, необходимая для создания индикатора выполнения – у вас есть информация, если загрузка еще продолжается, информация о том, сколько байтов будет передано в общей сложности и сколько байтов уже было перенесено.

Чтобы представить процесс загрузки пользователю, напишите еще один 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 или нет (недооценить индикатор выполнения VS, определенный индикатор выполнения)
  • Настраиваемый внешний вид, поскольку он использует механизм шаблонов dojo. Вы можете добавить свой класс / идентификаторы в шаблоны te в соответствии с вашим css

повеселись

HTML5 представил файл upload api, который позволяет отслеживать ход загрузки файлов, но для более старых браузеров есть платформа plupload , специально предназначенная для мониторинга загрузки файлов и предоставления информации о них. плюс у него много обратных вызовов, поэтому он может работать во всех браузерах

Gears и HTML5 имеют событие прогресса в объекте HttpRequest для отправки файла через AJAX.

http://developer.mozilla.org/en/Using_files_from_web_applications

Ваши другие варианты, на которые уже ответили другие, следующие:

  1. Flash-загрузчик.
  2. Java-загрузчик.
  3. Второй запрос типа кометы на веб-сервер или скрипт для сообщения о размере полученных данных. Некоторые веб-серверы, такие как Lighttpd, предоставляют модули для выполнения этого процесса, чтобы сохранить накладные расходы при вызове внешнего скрипта или процесса.

Технически есть четвертый вариант, похожий на загрузку YouTube, с Gears или HTML5 вы можете использовать blobs для разбиения файла на маленькие куски и индивидуально загружать каждый фрагмент. По завершении каждого фрагмента вы можете обновить статус выполнения.

Вам нужно будет использовать Javascript для создания индикатора выполнения. Простой поиск Google привел меня к этой статье: WebAppers Простой Javascript Progress Bar с CSS .

Dojo File Upload Progress Bar Widget – еще один вариант с использованием инфраструктуры Javascript Dojo.

EDIT: Предполагая, что вы загружаете большое количество изображений (например, фотоальбом) и отправляете их на свой PHP-скрипт, вы можете использовать javascript для чтения результатов с поста и обновления строки выполнения в зависимости от количества загруженных изображений / общее количество изображений. Это имеет побочный эффект только обновления после завершения каждой публикации. Ознакомьтесь с информацией о том, как публиковать сообщения в JS.

Может быть выполнен шаг выполнения php / ajax. (Оформить покупку библиотеки Html_Ajax в груше). Однако для этого требуется установка настраиваемого модуля в php.

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

Лучше всего использовать некоторую форму шага прогресса вспышки, если у вас нет контроля над вашим сервером.

флеш-загрузка будет выполнять эту работу. он будет загружать файл там, где вы хотите. Но для меня больше требований, чем для меня. Мне нужно изменить имя файла до завершения загрузки. это также возможно с флэш-решением, НО ТОЛЬКО, если вы добавляете переменную FIXED. Мне нужно добавить идентификатор пользователя к имени файла, и я не вижу способа сделать это.