Суть проблемы такова. Есть php-fpm + nginx. Нужно сделать красивый
прогрессбар для формы загрузки файла. Будь то apache + php как модуль апача, то
проблем бы не было вообще . Есть волшебная статья
"Отслеживание прогресса загрузки файлов с помощью сессий".
Но у нас конфигурация иная...
Короче нам понадобятся модули Upload и Upload Progress для nginx.
Nginx придется персобрать.
./configure --add-module=path/to/module
И подправить его конфиг (комментарии прилагаются ).
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
...
events {
...
}
http {
# определяем upload_progress
upload_progress upload 2m;
server {
...
# на какой урл нужно будет отправлять запросы
location = /upload/smth {
# максимальная длинна запроса
client_max_body_size 128m;
# суперглобальный массив $_FILES недоступен, поэтому информацию о файлах передаем как $_REQUEST['uploads']
upload_set_form_field "uploads[$upload_field_name][name]" "$upload_file_name";
upload_set_form_field "uploads[$upload_field_name][type]" "$upload_content_type";
upload_set_form_field "uploads[$upload_field_name][tmp_name]" "$upload_tmp_path";
upload_aggregate_form_field "uploads[$upload_field_name][size]" "$upload_file_size";
upload_aggregate_form_field "uploads[$upload_field_name][error]" "0";
# передаем скрипту все поля из формы, имена которых соответствуют маске
upload_pass_form_field "^[a-zA-Z\[\]0-9]+$";
# куда будет перенаправлен запрос после окончания загрузки файлов
upload_pass /passscript.php;
# куда будут сохранены файлы после загрузки
upload_store /tmp;
# удаляем загруженные файлы при следующих статусах запроса
upload_cleanup 404 500-505;
# лимит скорости загрузки
#upload_limit_rate 8k;
# как долго будет храниться информация после завершения загрузки
track_uploads upload 1m;
}
# по какому урлу будет доступна статистика загрузки файла
location = /upload/status/smth {
# немного тюним вывод
upload_progress_json_output;
upload_progress_template starting '{ "state" : "starting"}';
upload_progress_template error '{ "state" : "error", "status" : $uploadprogress_status }';
upload_progress_template done '{ "state" : "done"}';
upload_progress_template uploading '{ "state" : "uploading", "received" : $uploadprogress_received, "size" : $uploadprogress_length }';
# включаем отслеживание статистики загрузки файла
report_uploads upload;
}
...
}
}
Дальше все просто. Отправляем реквесты на урл "/upload/smth?X-Progress-ID=<key>", статистику получаем по урлу "/upload/status/smth?X-Progress-ID=<key>"