2009-05-11 3 views
76

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

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

+0

http: // stackoverflow.com/questions/10477135/simple-cross-browser-jquery-php-file-upload-with-progress-bar/10477249 # 10477249 –

ответ

68

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

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

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

+10

Вы захотите использовать это вместо этого, я верю: https://github.com/valums/file-uploader - тот же автор. –

+5

И посмотрите [Прогресс загрузки сеанса] (http://www.php.net/manual/en/session.upload-progress.php), что и предлагает PHP для получения прогресса для загрузки файлов из коробки. – hakre

+1

Функция загрузки сеанса, упомянутая @hakre, требует PHP 5.4, который все еще находится в бета-версии. Однако аналогичная функциональность была введена в PHP 5.2 в [Alternative PHP Cache] (http://us3.php.net/manual/en/ref.apc.php). – arlomedia

13

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

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

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

+13

Почему три downvotes? Это правда, и они совершенно необоснованны. Я осмеливаюсь показать мне индикатор выполнения, который работает на родном PHP, и не нуждается в дополнительных расширениях/модулях Apache/perl-скриптах/других материалах для работы. –

+1

Ну, это 2011 год, и теперь это возможно благодаря HTML5. См. Первый ответ здесь: http://stackoverflow.com/questions/76976/how-to-get-progress-from-xmlhttprequest – Zarel

+10

Ну, это 2012 год, а загрузка файлов в HTML5 через XMLHttpRequest по-прежнему недоступна во всех основных браузерах , –

1

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

Dojo File Upload Progress Bar Widget - еще один вариант с использованием рамки Javascript Dojo.

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

+6

-1 Индикатор выполнения Javascript хорош, но не имеет никакого отношения к загрузке файлов, насколько я могу судить. И индикатор выполнения загрузки Dojo не предоставляет никакого интерфейса для PHP. Исправьте меня, если я ошибаюсь, конечно. –

1

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

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

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

+0

Некоторые надстройки могут блокировать iframe, но браузеры? Можете ли вы привести пример? – ya23

+0

Включение термина «загрузка файла ajax php» возвращает 4 из 5 лучших результатов с использованием iframes (не уверен, что 5-й делает (страница не загружается)). Взгляните на примеры на каждом из сайтов. –

+0

Действительно, они используют iframe, но не упоминают, что он может быть заблокирован в любом случае. Или я пропустил это? – ya23

12

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

Rasmus Lerdorf (создатель PHP) имеет sample, используя YUI (ах, и вот PHP source).

См. the documentation here.

+0

Ни те же, ни ссылки на источник php больше не работают .. у вас есть ссылка на ссылку, пожалуйста? – supersan

+0

@supersan Этот ответ очень устарел. APC мертв, а API загрузки сеанса - это [отдельная вещь] (http://php.net/manual/en/session.upload-progress.php). Он также не работает, если сервер использует FastCGI ... что в большинстве случаев делает это по соображениям безопасности. – Powerlord

0

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

2

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

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

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

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

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

2

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

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

весело

7

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

Во-первых, см this пост, объясняющий, как получить "uploadprogress" расширение и работает.

Затем на страницу, содержащую форму, что вы загружаете файл (ы) с, создайте следующий IFRAME:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe> 

Далее, добавьте этот код вашей кнопки «Submit»:

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

+0

Как вы можете загрузить файл без $ _FILES в php – 2012-05-14 05:43:02

2

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

3

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

Смежные вопросы