Как получить прогресс файла при его загрузке через ajax? - PullRequest
0 голосов
/ 02 мая 2011

До сих пор я выяснил, КАК загружать файлы асинхронно с Ajax и PHP, никаких проблем там нет.Но я хочу получить процент файла, который уже был загружен, так как он загружается, и после нескольких часов исследований я не могу найти хороший способ сделать это без обмана .

Некоторые реализации Я видел использование Flash для загрузки, и получение процента во Flash, по-видимому, довольно распространено, но я бы хотел этого избежать, если смогу.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

Основная проблема заключается в том, что RFC 1867 , спецификация для загрузки файлов по HTTP через тип multipart/form-data MIME, не предоставляет какого-либо метода для обеспечения прогресса загрузки файла.

Загрузка файла на самом деле просто необычная форма отправки. Сценарии CGI, PHP и все другие веб-технологии, использующие интерфейсный веб-сервер для первого принятия запроса , могут фактически не начинать выполнение до тех пор, пока не будет завершена полная загрузка . Это означает, что они обычно не могут даже знать, когда началась загрузка, только когда она была завершена.

Новые версии расширения APC PHP включают обходной путь для этой проблемы , который выполняет некоторый уровень черной магии, который позволяет ему знать о загрузках ранее. Это работает только как часть mod_php, хотя. Разработчики, похоже, не планируют поддерживать его в рамках FastCGI .

Другим вариантом на стороне сервера будет расширение PECL "uploadprogress" . Я не совсем уверен, какую черную магию он использует. Источник предполагает, что он фактически подключается к обработке multipart MIME-частей. (Это предполагает, что, по крайней мере, некоторые SAPI-потоки передают данные из формы в PHP по мере их загрузки клиентом. Я знаю, что, по крайней мере, некоторые серверы FastCGI буферизируют весь запрос перед его передачей, поэтому это может не сработать для вас.

Обе эти опции предназначены для обычной загрузки файлов. Ajax - точнее, XMLHttpRequest - не поддерживает операции загрузки файлов. Большинство обходных путей в этой области включают создание iframe и отправку там формы, что также подразумевает чужую работу на стороне клиента. Если вы собираетесь пройти через этот уровень прыжков с обручем, вы также можете использовать один из современных виджетов для загрузки файлов.

Лично я использую Plupload , виджет Javascript, который может работать с любой любимой библиотекой Javascript, jQuery. Некоторые другие клянутся Uploadify . Независимо от того, оба эти виджета обеспечивают высокую степень обратной связи с пользователем для загрузки. Скорее всего, их будет проще внедрить, чем APC или uploadprogress, и их преимущество будет состоять в том, чтобы их тщательно собирали и тестировали другие люди.

Plupload поддерживает несколько механизмов загрузки, включая HTML5, Gears, Flash, Silverlight, oldschool HTML4 и другие. Между HTML5, Flash и Silverlight вы практически охватили 100% своей аудитории. Это также позволяет вам подписываться на события и иметь свой собственный код для выполнения магии. Например, если вам нужна информация о прогрессе загрузки файлов на стороне сервера, клиент может регулярно отправлять обновления в другой сценарий . Это было бы полезно, если у вас регулярно есть клиенты, загружающие огромные файлы, и вы хотите знать об этом в режиме реального времени.

tl; dr: Загрузка сложная, давайте перейдем на сторону клиента!

1 голос
/ 02 мая 2011

Да, мне тоже не нравится этот "читерский" метод. На мой взгляд, лучший способ - это использовать APC , а его метод apc_fetch

Использование ajax для создания apc_fetch с уникальным ключом, определяющим загрузку, вернет то, что вам нужно ... т.е. загруженных байт / всего байт.

Затем просто выполните индикатор выполнения с помощью JavaScript.

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

...