digitorum.ru

Как меня найти

Профиль

icq: 4415944

Отслеживание прогресса загрузки файлов средствами nginx

Суть проблемы такова. Есть 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>"