Кто-нибудь знает, как получить прогресс-бар для загрузки в 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