Создание индикатора выполнения файла в PHP
-
03-07-2019 - |
Вопрос
Кто-нибудь знает о каких-либо методах создания индикатора выполнения загрузки файла в PHP?Я часто слышал, что это невозможно.
У меня есть одна идея, но не уверен, сработает ли она:загрузите обычный файл, но вместо этого отправьте в iframe.Когда это будет отправлено, сохраните информацию о файле (размер и временное местоположение) в сеансе.В то же время запускайте вызов AJAX, скажем, каждые 10 секунд, чтобы проверить размер файла по сравнению с размером, сохраненным в сеансе.Это вернет размер AJAX, а затем индикатор выполнения будет увеличен и, возможно, отобразит загруженный размер пользователю.
Мысли?
Другие советы
Вы в значительной степени разобрались, как это сделать.Основная проблема заключается в том, что у вас обычно нет доступа к размеру загруженного файла, пока он не будет загружен.
Для этого существуют обходные пути:При включении APC вы сможете получить доступ к этой информации, если включите поле с именем "APC_UPLOAD_PROGRESS" и используете apc_fetch() для извлечения записи кэша со статусом.
Существует также плагин под названием uploadprogress, но он не очень хорошо документирован и не работает в Windows (во всяком случае, последний раз я проверял).
Альтернативой является использование Flash для этого.Смотрите сценарии, подобные Модная загрузка.
До появления APC мне пришлось написать CGI-скрипт на C, который записывал информацию в текстовый файл.Однако сейчас APC кажется гораздо лучшим способом сделать это.
Надеюсь, это поможет.
Пока что наиболее распространенным способом сделать это является SWFUpload: http://www.swfupload.org/
Тем не менее, это является возможно с чистым PHP, просто очень сложным и очень экспериментальным.Я посмотрю, смогу ли я найти ссылку.
Редактировать:Согласно комментариям к php.net, начиная с версии 5.2, есть хук для обработки хода загрузки. http://us.php.net/features.file-upload#71564
Дополнительные объяснения:
- http://www.dinke.net/blog/2006/11/04/php-52-upload-progress-meter/en/
- http://blog.liip.ch/archive/2006/09/10/upload-progress-meter-extension-for-php-5-2.html
Пример Расмуса:
Начиная с PHP 5.4, он находится в расширении сеанса: http://php.net//manual/pl/session.upload-progress.php
В чистом PHP вы правы:это невозможно.
Если вы используете AJAX-ify для этого, то вы могли бы делать то, что вы описываете.Единственные измерители прогресса, которые я когда-либо видел, находятся в Javascript или Flash, хотя я предполагаю, что Silverlight мог бы сделать и это.
"Старая школа", но PHP + Perl техника: http://www.raditha.com/php/progress.php
На мой взгляд, лучшим / самым простым решением является создание небольшого flash-виджета, который состоит из кнопки "Загрузить" и индикатора выполнения.Flash предоставляет вам очень подробную обратную связь о том, сколько данных было загружено на данный момент, и вы можете создать на ее основе хороший индикатор выполнения.Не требует неэффективного опроса сервера и фактически вообще не требует никаких изменений в коде вашего сервера.Поищите в Google "flash uploader", и вы обнаружите, что многие люди уже написали эти виджеты и с радостью продадут их вам за небольшие деньги.
Я бы порекомендовал посмотреть на SWFUpload Загрузить чтобы достичь того, чего вы хотите.Он довольно гибкий и поддерживает постановку файлов в очередь, так что вы даже можете обрабатывать загрузку нескольких файлов.
Вы определенно захотите пойти с загрузка фантазий Диджитджеральда.Он основан на Mootools & swfuplaod и имеет красивую очередь со статусами, прогрессом, eta и т.д.Это действительно самый простой метод загрузки файлов, который я когда-либо видел.В моем личном случае ivé использовал его, чтобы позволить клиенту выбрать 1,2 гб PDF-файлов и загрузить их.Более новые автоматически переименовываются и версионируются, те же самые пропускаются и т.д.