Загрузить индикатор прогресса в PHP - PullRequest
79 голосов
/ 11 мая 2009

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

Я довольно новичок в php, поэтому не знаю всего об этом.

Ответы [ 12 ]

70 голосов
/ 17 октября 2010

На данный момент (после нескольких часов поиска и поиска скриптов) самый простой в настройке и самый приятный загрузчик, который я нашел

https://github.com/FineUploader/fine-uploader

Он не требует APC или каких-либо других внешних библиотек PHP, я могу получить отзыв о ходе работы с файлом на общем хосте и заявляет, что поддерживает перетаскивание html5 (лично не проверено) и несколько загрузок файлов.

13 голосов
/ 21 января 2010

Если у вас установлен APC , он имеет функцию обратного вызова для выполнения загрузки.

Rasmus Lerdorf (создатель PHP) имеет образец этого с использованием YUI (о, а вот источник PHP ).

См. документацию здесь .

13 голосов
/ 11 мая 2009

Мне жаль говорить, что, насколько мне известно, просто индикатор выполнения загрузки PHP или даже индикатор выполнения загрузки PHP / Javascript невозможен из-за работы PHP. Лучше всего использовать Flash-загрузчик в той или иной форме.

AFAIK Это потому, что ваш скрипт не выполняется до тех пор, пока не будут заполнены все суперглобальные объекты, включая $ _FILES. К тому времени, когда ваш PHP-скрипт вызывается, файл уже загружен.

РЕДАКТИРОВАТЬ: Это больше не так. Это было в 2010 году.

8 голосов
/ 13 ноября 2010

Один способ с поддержкой PHP (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 вложенных

с разными цветами), если хотите. Iframe с прогрессом загрузки естественным образом работает только во время загрузки и заканчивает свою видимую жизнь после отправки формы и перезагрузки браузера на следующую страницу.
3 голосов
/ 20 ноября 2013

Реализация индикатора выполнения загрузки проста и не требует никаких дополнительных расширений 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 .

2 голосов
/ 25 марта 2011

HTML5 представил API загрузки файлов , который позволяет отслеживать ход загрузки файлов, но для более старых браузеров есть plupload платформа, специально предназначенная для мониторинга загрузки файлов и предоставления информации о их. Кроме того, он имеет множество обратных вызовов, поэтому он может работать во всех браузерах

2 голосов
/ 14 мая 2010

Еще один загрузчик полный JS: http://developers.sirika.com/mfu/

  • Его бесплатно (лицензия BSD)
  • Internationalizable
  • совместимость с различными браузерами
  • у вас есть выбор: установить APC или нет (недооценивать индикатор выполнения, VS определить индикатор выполнения)
  • Настраиваемый вид, поскольку он использует шаблонный механизм Dojo. Вы можете добавить свои классы / идентификаторы в те шаблоны в соответствии с вашим CSS

веселись

2 голосов
/ 10 марта 2010

Gears и HTML5 имеют событие прогресса в объекте HttpRequest для отправки файла, загружаемого через AJAX.

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

Ваши другие варианты, как уже отвечали другие:

  1. Загрузчик на основе Flash.
  2. Загрузчик на основе Java.
  3. Второй кометный запрос на веб-сервер или сценарий для сообщения о размере полученных данных. Некоторые веб-серверы, такие как Lighttpd, предоставляют модули для выполнения этого в процессе, чтобы сэкономить накладные расходы на вызов внешнего скрипта или процесса.

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

2 голосов
/ 11 мая 2009

Я только что нашел Mega Upload (http://www.raditha.com/php/progress.php), который использует perl для загрузки и отображения индикатора выполнения.

1 голос
/ 11 мая 2009

Можно сделать индикатор выполнения php / ajax. (Проверьте библиотеку Html_Ajax в груше). Однако это требует установки пользовательского модуля в php.

Другие методы требуют использования iframe, через который php смотрит, сколько файлов было загружено. Однако этот скрытый iframe может быть заблокирован некоторыми надстройками браузера, поскольку скрытые iframes часто используются для отправки вредоносных данных на компьютер пользователя.

Лучше всего использовать некоторую форму индикатора выполнения, если у вас нет контроля над сервером.

...