Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

EDIT: Это уже не так. Это было в 2010 году.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Реализация индикатора выполнения загрузки проста и не требует дополнительного расширения 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 script, чем загружаемый, который будет смотреть только на информацию о загрузке в сеансе и, например, вернуть его в формате JSON. Этот script можно вызывать периодически, например каждую секунду, используя AJAX и информацию, представленную пользователю.

Вы даже можете отменить загрузку, установив $_SESSION[$key]['cancel_upload'] в true.

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

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

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

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

Ответ 12

Загрузка флэш-памяти будет выполнять эту работу. он будет загружать файл там, где вы хотите. Но для меня больше требований, чем для меня. Мне нужно изменить имя файла до завершения загрузки. это также возможно с флэш-решением, НО ТОЛЬКО, если вы добавляете переменную FIXED. Мне нужно добавить идентификатор пользователя к имени файла, и я не вижу способа сделать это.