Кто-нибудь знает, как получить индикатор выполнения загрузки на php? Я пытаюсь написать код для загрузчика фотоальбомов. Я хочу, чтобы во время загрузки фотографий отображался индикатор выполнения.
Я новичок в php, поэтому не знаю о нем всего.
Кто-нибудь знает, как получить индикатор выполнения загрузки на php? Я пытаюсь написать код для загрузчика фотоальбомов. Я хочу, чтобы во время загрузки фотографий отображался индикатор выполнения.
Я новичок в php, поэтому не знаю о нем всего.
Ответы:
Это, безусловно (после нескольких часов поиска в 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 вложенных <div> с разными цветами), если хотите. Окно iframe с ходом загрузки, естественно, работает только во время загрузки и завершает свой видимый срок после отправки формы и перезагрузки браузера на следующую страницу.
Реализовать индикатор выполнения загрузки просто и не требуется никаких дополнительных расширений PHP, JavaScript или Flash. Но вам нужен PHP 5.4 и новее .
Вы должны включить сбор информации о ходе загрузки, установив для директивы session.upload_progress.enabled
значение On
in php.ini
.
Затем добавьте скрытый ввод в форму загрузки HTML непосредственно перед вводом любых других файлов. HTML-атрибут name
этого скрытого ввода должен быть таким же, как значение директивы session.upload_progress.name
from 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/
радоваться, веселиться
HTML5 представил API загрузки файлов, который позволяет вам отслеживать ход загрузки файлов, но для старых браузеров существует платформа plupload , специально созданная для мониторинга загрузки файлов и предоставления информации о них. плюс у него есть множество обратных вызовов, поэтому он может работать во всех браузерах
В Gears и HTML5 в HttpRequest
объекте есть событие progress для отправки файла, загружаемого через AJAX.
http://developer.mozilla.org/en/Using_files_from_web_applications
Другие ваши варианты, как уже ответили другие:
Технически существует четвертый вариант, аналогичный загрузке на YouTube, с Gears или HTML5 вы можете использовать капли, чтобы разбить файл на небольшие фрагменты и отдельно загрузить каждый фрагмент. По завершении каждого фрагмента вы можете обновить статус выполнения.
Вам нужно будет использовать Javascript для создания индикатора выполнения. Простой поиск в Google привел меня к этой статье: WebAppers Простая панель выполнения Javascript с CSS .
Виджет панели выполнения загрузки файла Dojo - еще один вариант использования инфраструктуры Dojo Javascript.
РЕДАКТИРОВАТЬ: предполагая, что вы загружаете большое количество изображений (например, фотоальбом) и отправляете их в свой PHP-скрипт, вы можете использовать javascript для чтения результатов из публикации и обновления индикатора выполнения в зависимости от количества загруженных изображений. / общее количество изображений. Это имеет побочный эффект: обновление происходит только после завершения каждой публикации. Проверьте здесь некоторую информацию о том , как размещать с JS.
Индикатор выполнения php / ajax можно сделать. (Оформить заказ на библиотеку Html_Ajax в груши). Однако для этого требуется установка специального модуля в php.
Другие методы требуют использования iframe, через который php проверяет, какая часть файла была загружена. Однако этот скрытый iframe может быть заблокирован некоторыми надстройками браузера, потому что скрытые iframe часто используются для отправки вредоносных данных на компьютер пользователя.
Лучше всего использовать какую-либо форму индикатора выполнения flash, если у вас нет контроля над своим сервером.