Индикатор выполнения загрузки в PHP


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

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

Author: casperOne, 2009-05-11

12 answers

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

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

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

 69
Author: Jesse, 2016-06-29 03:35:55

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

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

ИЗМЕНИТЬ: Это больше не так. Это было в 2010 году.

 13
Author: Macha, 2013-05-24 22:36:04

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

У Расмуса Лердорфа (создателя PHP) есть пример этого с использованием YUI (о, и вот источник PHP).

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

 12
Author: Powerlord, 2013-01-18 11:13:43

Один PHP-иш (5.2+) и без флэш-памяти, который хорошо работал для меня:

Во-первых, см. это сообщение, объясняющее, как запустить и запустить расширение "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 с ходом загрузки, естественно, работает только во время загрузки, и завершает свою видимую жизнь после отправки формы и перезагрузки браузера на следующую страницу.
 7
Author: IvarsK, 2017-10-23 09:22:30

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

 3
Author: Dawid Ferenczy, 2017-10-23 09:22:44

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

 2
Author: Josh Curren, 2009-05-11 18:07:35

Другой загрузчик, полный JS: http://developers.sirika.com/mfu/

  • Его бесплатная (лицензия BSD)
  • Интернационализируемый
  • совместимость с несколькими браузерами
  • у вас есть выбор устанавливать APC или нет (промежуточный индикатор выполнения ИЛИ определенный индикатор выполнения)
  • Настраиваемый внешний вид, поскольку он использует механизм шаблонов dojo. Вы можете добавить свой класс/идентификаторы в шаблоны te в соответствии с вашим css

Получайте удовольствие

 2
Author: Valdelievre, 2010-05-14 07:18:59

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

 2
Author: the master, 2012-05-04 14:45:54

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

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

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

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

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

 2
Author: Steve-o, 2017-01-25 21:54:44

Вам потребуется использовать Javascript для создания индикатора выполнения. Простой поиск в Google привел меня к этой статье: Веб-приложения Простой индикатор выполнения Javascript с CSS.

Виджет индикатора выполнения загрузки файлов Dojo - это еще один вариант использования платформы Javascript Dojo.

РЕДАКТИРОВАТЬ: Предполагая, что вы загружаете большое количество изображений (например, фотоальбом) и размещаете их в своем PHP-скрипте, вы можете использовать javascript, чтобы прочитать результаты из публикации и обновить индикатор выполнения, основанный на количестве загруженных изображений /общем количестве изображений. Это имеет побочный эффект, заключающийся в обновлении только после завершения каждой публикации. Ознакомьтесь с здесь для получения некоторой информации о том, как публиковать сообщения с помощью JS.

 1
Author: Joey Robert, 2009-05-11 17:56:33

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

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

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

 1
Author: Ali Lown, 2010-01-21 18:18:54

Флэш-загрузка выполнит эту работу. он загрузит файл туда, куда вы хотите. Но для меня есть и другие требования. мне нужно изменить имя файла до завершения загрузки. это также возможно с помощью flash-решения, НО ТОЛЬКО в том случае, если вы добавляете ФИКСИРОВАННУЮ переменную. Мне нужно добавить идентификатор пользователя в имя файла, и я не вижу способа это сделать.

 0
Author: nibuster, 2010-02-26 22:52:21