Завантажити індикатор прогресу в PHP


82

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

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


Відповіді:


70

Це на сьогоднішній день (після кількох годин гуглиння та випробування сценаріїв) найпростіший у налаштуванні та найкращий завантажувач, який я знайшов

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

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


11
Ви хочете використовувати це замість цього, я вважаю: github.com/valums/file-uploader - той самий автор.
Michael Reed

6
Будь ласка, ознайомтесь із ходом завантаження сеансу, який пропонує PHP для отримання прогресу при завантаженні файлу з коробки.
hakre

7
@jpeskin це несправедливо щодо розробника. те, що ви "пропонуєте їм заплатити", не зобов'язує їх, як якусь повію, робити за вас роботу. якщо ви не можете зрозуміти, як це налагодити, то я б не ходив, вказуючи пальцем на когось іншого, крім себе - програмне забезпечення, яке ви знайдете в Інтернеті, надається "як є", тому не ходіть, б'ючи людей, які не роблячи нічого іншого, як намагання допомогти.
sucitivel

3
@sucitivel Щоб бути докладнішим: я запропонував заплатити, і він прийняв, потім ми зіткнулися з проблемою документування всіх помилок, які ми бачили, а потім він перестав відповідати на будь-які електронні листи (просто ввічливі, із запитом на оновлення статусу та його все ще цікавила робота). Я не вважаю когось зобов’язаним працювати за гроші. Це був просто оглядовий пункт даних для інших, хто, можливо, захоче дізнатись про доступність розробника та / або інтерес до роботи у фрілансі. Проект був розгалужений, тому я не був єдиним, хто відчував, що розробник втрачає інтерес до підтримки.
jpeskin

5
blueimp.github.com/jQuery-File-Upload - це працює дуже добре. Принаймні мені це подобається, оскільки він не відстає від Ubuntu =)
BeRocket

13

Якщо у вас встановлений APC , він має гачок зворотного виклику для перебігу завантаження.

Расмус Лердорф (творець PHP) має зразок цього з використанням YUI (о, і ось джерело PHP ).

Дивіться документацію тут .


Ні те ж саме, ні посилання на джерело php вже не працюють .. у вас є посилання alt, будь ласка?
суперсан

@supersan Ця відповідь дуже застаріла. APC мертвий, а API завантаження сеансу - це окрема справа . Це також не працює, якщо сервер використовує FastCGI ... що більшість із міркувань безпеки роблять сьогодні.
Powerlord

12

Мені шкода сказати, що, наскільки мені відомо, чистий індикатор ходу завантаження PHP або навіть індикатор ходу завантаження PHP / Javascript неможливий через те, як працює PHP. Найкраще - скористатися будь-якою формою завантажувача Flash.

AFAIK Це тому, що ваш скрипт не виконується, поки не будуть заповнені всі суперглобалі, що включає $ _FILES. На момент виклику вашого PHP-сценарію файл повністю завантажується.

EDIT: Це вже неправда. Це було в 2010 році.


13
Чому три голоси проти? Це правда, і вони абсолютно невиправдані. Я наважуюсь показати мені індикатор виконання, який працює на рідному PHP і не потребує додаткових розширень / модулів Apache / скриптів perl / інших матеріалів для роботи.
Пекка

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-іш (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);"

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


Як можна завантажувати файл без $ _FILES у php

4

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


2

Ще один завантажувач із повним JS: http://developers.sirika.com/mfu/

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

весело провести час


2

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


2

Gears та HTML5 мають подію прогресу в HttpRequestоб’єкті для надсилання файлу, завантаженого через AJAX.

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

Ваші інші варіанти, на які вже відповіли інші:

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

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


1

Вам потрібно буде використовувати Javascript для створення індикатора прогресу. Простий пошук у Google привів мене до цієї статті: Проста панель прогресу Javascript WebAppers з CSS .

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

РЕДАГУВАТИ: якщо припустити, що ви завантажуєте велику кількість зображень (наприклад, фотоальбом), та розміщуєте їх у своєму PHP-сценарії, ви можете використовувати javascript для читання результатів із повідомлення та оновлення індикатора прогресу на основі кількості завантажених зображень / загальна кількість зображень. Це має побічний ефект лише оновлення після завершення кожного допису. Перегляньте тут деяку інформацію про те, як розміщувати повідомлення в JS.


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

1

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

Інші методи вимагають використання iframe, за допомогою якого php дивиться, скільки файлу було завантажено. Однак цей прихований iframe може бути заблокований деякими аддонами браузера, оскільки приховані iframe часто використовуються для передачі шкідливих даних на комп'ютер користувачів.

Найкраще зробити ставку на використання певної форми індикатора прогресу, якщо у вас немає контролю над сервером.


Деякі доповнення можуть блокувати вставки, але браузери? Можете навести приклад?
ya23,

Гуглиння термінів "завантаження файлу ajax php" повертає 4 з 5 найкращих результатів, усі з використанням фреймів (не впевнений, що 5-й (сторінка не завантажується)). Погляньте на приклади на кожному з веб-сайтів.
Алі Лоун

Дійсно, вони використовують iframes, але не згадуючи, що це може бути заблоковано в будь-якому випадку. Або я пропустив це?
ya23,

На жаль, помилково прочитав те, що ти намагався запитати, ні, я не можу навести жодних прикладів браузерів, які безпосередньо блокують iframes, я думав про аддони, які люди використовують із ними, такі як noscript, який блокує iframes. Оновлений текст у дописі для подальшого використання.
Алі Лоун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.