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

82

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

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

Джош Каррен
источник

Ответы:

70

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

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

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

Джесси
источник
11
Я считаю, что вы захотите использовать это вместо этого: github.com/valums/file-uploader - тот же автор.
Майкл Рид
6
И, пожалуйста, просмотрите Прогресс загрузки сеанса, который предлагает PHP, чтобы получить прогресс для загрузки файла из коробки.
hakre
7
@jpeskin это несправедливо по отношению к разработчику. То, что вы «предлагаете им заплатить», не обязывает их, как проституток, выполнять работу за вас. если вы не можете придумать, как его отлаживать, я бы не стал показывать пальцем ни на кого, кроме вас самих - программное обеспечение, которое вы найдете в Интернете, предоставляется «как есть», так что не ругайте людей, которые ничего не делает, кроме как пытается помочь.
Sucitivel 02
3
@sucitivel Чтобы быть более подробным: я предложил заплатить, и он согласился, затем мы постарались задокументировать все обнаруженные ошибки, а затем он перестал отвечать на все электронные письма (просто вежливые, с запросом обновления статуса и он все еще интересовался работой). Я не считаю кого-либо обязанным работать за деньги. Это была просто точка наблюдения за данными для других, которые могли захотеть узнать о доступности и / или интересе разработчика к внештатной работе. Проект был разветвлен, поэтому я был не единственным, кто чувствовал, что разработчик теряет интерес к поддержке.
jpeskin
5
blueimp.github.com/jQuery-File-Upload - это действительно хорошо работает. По крайней мере, он мне нравится, так как он не отстает от Ubuntu =)
BeRocket
13

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

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

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

Пауэрлорд
источник
Ни те же ссылки, ни ссылки на исходный текст php больше не работают .. у вас есть альтернативная ссылка, пожалуйста?
supersan
@supersan Этот ответ очень устарел. APC мертв, а API загрузки сеанса - это отдельная вещь . Это также не работает, если сервер использует FastCGI ... что в настоящее время чаще всего используется по соображениям безопасности.
Powerlord
12

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

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

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

Маха
источник
13
Почему три голоса против? Это правда, и они совершенно неоправданные. Осмелюсь кому-нибудь показать мне индикатор выполнения, который работает на собственном PHP и не требует дополнительных расширений / модулей Apache / сценариев perl / других вещей для работы.
Pekka
1
Что ж, это 2011 год, и теперь это возможно благодаря HTML5. См. Первый ответ здесь: stackoverflow.com/questions/76976/…
Zarel
10
Что ж, это 2012 год, а загрузка файлов в HTML5 через XMLHttpRequest по-прежнему доступна не во всех основных браузерах.
Damien B
3
@Pekka 웃 Это неправда. Если у вас установлен APC (а вы должны это сделать), вы можете сделать это полностью на PHP, а также без javascript.
Ариэль
2
@Pekka 웃 Не говоря уже о загрузке с использованием информации о сеансе в PHP> = 5.4.
Wookie88
8

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

Иварск
источник
Как вы можете загрузить файл без $ _FILES в php
4

Реализовать индикатор выполнения загрузки просто и не требуется никаких дополнительных расширений PHP, JavaScript или Flash. Но вам нужен PHP 5.4 и новее .

Вы должны включить сбор информации о ходе загрузки, установив для директивы session.upload_progress.enabledзначение Onin php.ini.

Затем добавьте скрытый ввод в форму загрузки HTML непосредственно перед вводом любых других файлов. HTML-атрибут nameэтого скрытого ввода должен быть таким же, как значение директивы session.upload_progress.namefrom 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

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

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

радоваться, веселиться

Valdelievre
источник
2

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

мастер
источник
2

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

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

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

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

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

Стив-о
источник
1

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

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

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

Джои Роберт
источник
6
-1 Индикатор выполнения Javascript хорош, но, насколько я могу судить, не имеет ничего общего с загрузкой файлов. А индикатор выполнения загрузки Dojo не предоставляет никакого интерфейса для PHP. Поправьте меня, если я ошибаюсь, конечно.
Pekka
1

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

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

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

Али Лаун
источник
Некоторые надстройки могут блокировать фреймы, но браузеры? Вы можете привести пример?
ya23
Поиск в Google терминов «загрузка файла ajax php» возвращает 4 из 5 лучших результатов, все с использованием iframe (не уверен, что 5-й делает (страница не загружается)). Взгляните на примеры на каждом из сайтов.
Али Лаун
Действительно, они используют фреймы, но не упоминают, что они могут быть заблокированы в любом случае. Или я это пропустил?
ya23
Извините, неправильно прочитал то, что вы пытались спросить, нет, я не могу привести примеры браузеров, которые напрямую блокируют iframe, я думал о надстройках, которые люди используют с ними, таких как noscript, который блокирует iframe. Обновленный текст в сообщении для дальнейшего использования.
Али Лаун