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

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

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

12 ответов


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

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

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


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

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

EDIT: это больше не верно. Это было в 2010.


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

Расмус Лердорф (создатель PHP) имеет пример этого с помощью YUI (О, И вот PHP source).

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


один PHP-ish (5.2+) & no-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 вложенных

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

реализация индикатора выполнения загрузки проста и не требует дополнительного расширения PHP, JavaScript или Flash. Но!--17-->нужен PHP 5.4 и новее.

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

затем добавьте скрытый ввод в форму загрузки HTML просто до любые другие файловые входы. В HTML-атрибут name этого скрытый ввод должен совпадать со значением директивы session.upload_progress.name С php.ini (в конечном итоге предшествует session.upload_progress.prefix). The 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'] to true.

для детальной информации, дополнительных установок и потребителя комментарии руководство по PHP.


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


другой загрузчик full JS:http://developers.sirika.com/mfu/

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

удачи


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


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

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

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

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

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


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

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

EDIT: предполагая, что вы загружаете большое количество изображений (например, фотоальбом) и размещаете их в своем PHP-скрипте, вы можете использовать javascript для чтения результатов сообщение и обновление индикатора выполнения на основе количества загруженных изображений / общего количества изображений. Это имеет побочный эффект только обновления после завершения каждой должности. Проверьте здесь для некоторой информации о том, как опубликовать с JS.


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

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

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


flash upload сделает эту работу. она будет загружать файл, где вы хотите. Но у меня есть и другие требования. мне нужно изменить имя файла до завершения загрузки. это также возможно с решением flash, но только если вы добавляете фиксированную переменную. Мне нужно добавить идентификатор пользователя в имя файла, и я не вижу способа сделать это.