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

 

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

Как создать грамотное оформление страницы 404 на собственном сайте
Web

Как создать грамотное оформление страницы 404 на собственном сайте

Web

Где PHP хранит журнал ошибок?

Как провести измерения площади по карте Гугл: подробная инструкция
Web

Как провести измерения площади по карте Гугл: подробная инструкция

Google оптимизация изображений и их уменьшение без потери качества
Web

Google оптимизация изображений и их уменьшение без потери качества