Web

Управление индикатором выполнения загрузки в PHP

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

 

Ответ 1

Один из способов на PHP (5.2+) и без Flash, который хорошо сработал для меня:

На странице, содержащей форму, с которой вы загружаете файл(ы), создайте следующий iframe:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

 Затем добавьте этот код на кнопку «Submit»:

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> с разными цветами), если хотите. Естественно, iframe с прогрессом загрузки работает, только пока идет загрузка, и заканчивает свою видимую активность, когда форма отправлена и браузер перезагружается на некоторую страницу.

 

Ответ 2

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

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

Затем добавьте скрытый вход в форму загрузки HTML непосредственно перед другими входами файлов. Имя 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, который будет заполнен информацией о статусе загрузки. Ключ представляет собой конкатенированные имя и значение скрытого ввода. В 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,   // Время запроса

  "content_length" => 57343257, // Длина содержимого POST

  "bytes_processed" => 54321,   // Количество полученных и обработанных байтов

  "done" => false,              // true, когда обработчик POST завершен, успешно или нет.

  "files" => array(

    0 => array(

      "field_name" => "file1",    // Имя поля <input />

      // Следующие 3 элемента равны элементам в $_FILES

      "name" => "filename.ext",

      "tmp_name" => "/tmp/phpxxxxxx",

      "error" => 0,

      "done" => false,            // Истина, когда обработчик POST завершил обработку этого файла

      "start_time" => 1234567890, // Когда этот файл начал обрабатываться

      "bytes_processed" => 54321, // Количество байтов, полученных и обработанных для данного файла

    )

  )

);

Здесь есть вся информация, необходимая для создания индикатора прогресса, —  у вас есть информация о том, идет ли еще загрузка, информация о том, сколько байт будет передано всего и сколько байт уже передано. Чтобы представить пользователю прогресс загрузки, напишите другой PHP-скрипт, отличный от загружаемого, который будет просматривать информацию о загрузке только в сессии и возвращать ее, например, в формате JSON. Этот скрипт можно вызывать периодически, например, каждую секунду, используя AJAX, и предоставлять информацию пользователю. Вы даже можете отменить загрузку, установив значение $_SESSION[$key]['cancel_upload'] в true. Подробную информацию, дополнительные настройки и комментарии пользователя смотрите в руководстве PHP.

 

Ответ 3

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

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

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

 

Ответ 4

Для создания индикатора прогресса необходимо использовать Javascript. Простой поиск в Google привел меня к этой статье: 

WebAppers Simple Javascript Progress Bar with CSS.

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

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

 

Схожие статьи

Блокировка сайта Роскомнадзором: какие основания могут быть
Web

Блокировка сайта Роскомнадзором: какие основания могут быть

Web

Передача значений массива $_POST с помощью cURL

Web

Как распарсить и обработать HTML/XML в PHP?

Web

Перегрузка функций PHP

×