Самое простое решение - это, вероятно, Flash, но оно также и самое уродливое: как говорили некоторые люди на форуме SWFUpload, поддержка Flash в Linux вроде бы отстой, и, в конце концов, если можете, вам следует избегать ее использования.
Итак, следующее решение - использовать комбинацию серверных модулей + Javascript на клиенте.
Примечание
Я уже частично ответил на ваш вопрос по ServerFault .
Для простоты я предлагаю вам перейти на Apache или Lighttpd.
Модуль на стороне сервера ( модуль процесса загрузки Apache / lighttpd mod_uploadprogress ) обрабатывает загрузку файла и предоставляет API, который можно запросить в Javascript, чтобы получить текущий прогресс.
На стороне клиента у вас есть 2 варианта (как показано в библиотеке File Uploader , которую вы не должны использовать, если не хотите модифицировать серверные модули):
более новые браузеры позволяют выполнять и контролировать загрузку в вызове AJAX (см. здесь )
практически все браузеры, старые и новые, позволяют выполнять загрузку в форме и отслеживать ее через AJAX с помощью «трюка IFrame»: поскольку загружаемая в данный момент загрузка файла препятствует запуску кода Javascript (что запрещает чтобы запросить сервер и обновить индикатор выполнения), вам нужно включить скрытый IFrame на страницу загрузки и установить действие формы для этого IFrame. Таким образом, код Javascript на «главной странице» может выполняться, пока идет загрузка.
Для Javascript на стороне клиента вы либо пишете его самостоятельно, либо можете использовать существующую библиотеку (смотрите здесь ).
Ваша цель - запросить у сервера ход выполнения файла и отобразить его. Для хороших индикаторов прогресса посмотрите на jqueryUI .
В качестве последнего замечания вы можете взглянуть на мой код , я решал ту же проблему и использовал Ruby / Sinatra / Haml / Passenger / Apache.
Надеюсь, это поможет