Основная проблема заключается в том, что 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: Загрузка сложная, давайте перейдем на сторону клиента!