Загрузить индикатор прогресса в PHP
Кто-нибудь знает, как получить индикатор загрузки для загрузки в php? Я пытаюсь написать код для загрузки фотоальбома. Я хочу, чтобы индикатор выполнения отображался во время загрузки фотографий.
Я довольно новичок в php, поэтому я не знаю все об этом.
12 ответов
На данный момент это (после нескольких часов поиска в Google и скриптов) самый простой в настройке и самый приятный загрузчик, который я нашел
https://github.com/FineUploader/fine-uploader
Он не требует APC или каких-либо других внешних библиотек PHP, я могу получать отзывы о прогрессе файла на общем хосте, и он утверждает, что поддерживает перетаскивание html5 (лично не проверено) и несколько загрузок файлов.
Если у вас установлен APC, он имеет функцию обратного вызова для выполнения загрузки.
У Расмуса Лердорфа (создателя PHP) есть пример этого с использованием YUI (о, и вот источник PHP).
Смотрите документацию здесь.
Мне жаль говорить, что, насколько мне известно, просто индикатор выполнения загрузки PHP или даже индикатор выполнения загрузки PHP/Javascript невозможен из-за того, как работает PHP. Лучше всего использовать Flash-загрузчик.
AFAIK Это потому, что ваш скрипт не выполняется до тех пор, пока не будут заполнены все суперглобальные переменные, включая $_FILES. К тому времени, когда ваш PHP-скрипт вызывается, файл уже загружен.
РЕДАКТИРОВАТЬ: Это больше не правда. Это было в 2010 году.
Один способ PHP-ish (5.2+) и без 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 вложенных элемента
Реализация индикатора выполнения загрузки проста и не требует никаких дополнительных расширений 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
)
)
);
Здесь есть вся информация, необходимая для создания индикатора выполнения - у вас есть информация о том, идет ли загрузка, сколько всего байт будет передано и сколько байт уже передано.
Чтобы представить пользователю процесс загрузки, напишите другой сценарий PHP, отличный от загружаемого, который будет смотреть только информацию о загрузке в сеансе и возвращать ее, например, в формате JSON. Этот скрипт может вызываться периодически, например, каждую секунду, с использованием AJAX и информации, предоставляемой пользователю.
Вы даже можете отменить загрузку, установив $_SESSION[$key]['cancel_upload']
в true
,
Для получения дополнительной информации, дополнительных настроек и комментариев пользователя см. Руководство по PHP.
Еще один загрузчик полного JS: http://developers.sirika.com/mfu/
- Его бесплатно (лицензия BSD)
- Internationalizable
- кросс-браузерный
- у вас есть выбор: установить APC или нет (недействительный индикатор выполнения VS определенный индикатор выполнения)
- Настраиваемый вид, поскольку он использует шаблонный механизм Dojo. Вы можете добавить свои классы / идентификаторы в те шаблоны в соответствии с вашим CSS
повеселись
Я только что нашел Mega Upload ( http://www.raditha.com/php/progress.php), который использует perl для загрузки и отображения индикатора выполнения.
Gears и HTML5 имеют событие прогресса в HttpRequest
объект для отправки файла загрузки через AJAX.
http://developer.mozilla.org/en/Using_files_from_web_applications
Ваши другие варианты, как уже отвечали другие:
- Загрузчик на основе Flash.
- Загрузчик на основе Java.
- Второй запрос в стиле кометы к веб-серверу или сценарий, сообщающий о размере полученных данных. Некоторые веб-серверы, такие как Lighttpd, предоставляют модули для выполнения этого в процессе, чтобы сэкономить накладные расходы на вызов внешнего скрипта или процесса.
Технически существует четвертый вариант, похожий на загрузку с YouTube, с Gears или HTML5 вы можете использовать большие двоичные объекты, чтобы разбить файл на маленькие порции и по отдельности загрузить каждую порцию. По завершении каждого чанка вы можете обновить статус выполнения.
HTML5 представил API загрузки файлов, который позволяет отслеживать ход загрузки файлов, но для более старых браузеров есть встроенная платформа, специально предназначенная для мониторинга загрузки файлов и предоставления информации о них. Кроме того, он имеет множество обратных вызовов, поэтому он может работать во всех браузерах.
Вам нужно будет использовать Javascript для создания индикатора выполнения. Простой поиск в Google привел меня к этой статье: Простая панель прогресса Javascript с помощью CSS.
Виджет индикатора выполнения загрузки файла Dojo - это еще один вариант, использующий инфраструктуру Dojo Javascript.
РЕДАКТИРОВАТЬ: Предполагая, что вы загружаете большое количество изображений (например, фотоальбом), и размещаете их в своем скрипте PHP, вы можете использовать javascript для считывания результатов из поста и обновления индикатора выполнения в зависимости от количества загруженных изображений. / общее количество изображений. Это побочный эффект обновления только после завершения каждого сообщения. Проверьте здесь некоторую информацию о том, как разместить с JS.
Индикатор выполнения php/ajax может быть сделан. (Проверьте библиотеку Html_Ajax в груше). Однако это требует установки пользовательского модуля в php.
Другие методы требуют использования iframe, через который php смотрит, сколько файлов было загружено. Однако этот скрытый iframe может быть заблокирован некоторыми дополнениями браузера, потому что скрытые iframes часто используются для отправки вредоносных данных на компьютер пользователя.
Лучше всего использовать какую-либо форму индикатора выполнения, если у вас нет контроля над вашим сервером.
Флэш -загрузка сделает работу. он загрузит файл, где вы хотите. Но есть больше требований, чем это для меня. Мне нужно изменить имя файла до завершения загрузки. это также возможно с помощью flash-решения, ТОЛЬКО если вы добавляете FIXED-переменную. Мне нужно добавить идентификатор пользователя к имени файла, и я не вижу способа сделать это.