Nginx upload module (v 2.2.0)

рус анг

Модуль для веб-сервера nginx для обработки загрузок файлов согласно RFC 1867, а так же возобновляемых загрузок файлов согласно этой спецификации.

Описание

Модуль разбирает тело запроса и сохраняет все загружаемые файлы в каталог, заданный директивой upload_store. Загружаемые файлы вырезаются из тела запроса и измененный запрос после этого отправляется на location, задаваемый директивой upload_pass, позволяя обрабатывать загрузку файлов произвольным образом. Каждое файловое поле запроса может быть заменено на набор полей, задаваемый директивой upload_set_form_field. Содержимое каждого загруженного файла после этого может быть прочитано из файла, на который указывает переменная $upload_tmp_path или файл может быть просто перемещен в итоговое место назначения. Удаление загруженных файлов при возникновении ошибок контролируется директивой upload_cleanup. Если в запросе использован метод отличный от POST, модуль возвращает ошибку 405 (Method not allowed). Такие запросы могут быть обработаны в альтернативном локейшене директивой error_page.

Параметры конфигурации


синтаксис: upload_pass <location>
значение по-умолчанию: нет
строгость: обязательная
контекст: server, location

Указывает location, которому будет передано измененное тело запроса.


синтаксис: upload_resumable <on/off>
значение по-умолчанию: off
строгость: необязательная
контекст: main, server, location

Разрешает возобновляемые загрузки.


синтаксис: upload_store <каталог> [<уровень 1> [<уровень 2> ] ... ]
значение по-умолчанию: нет
строгость: обязательная
контекст: server, location

Указывает каталог в который будут записаны загружаемые файлы. Каталог может быть хэшированный. В этом случае все подкаталоги должны быть созданы перед запуском nginx.


синтаксис: upload_state_store <каталог> [<уровень 1> [<уровень 2> ] ... ]
значение по-умолчанию: нет
строгость: необязательная
контекст: server, location

Указывает каталог в котором будут хранится файлы состояния возобновляемых загрузок. Каталог может быть хэшированный. В этом случае все подкаталоги должны быть созданы перед запуском nginx.


синтаксис: upload_store_access <режим доступа>
значение по-умолчанию: user:rw
строгость: необязательная
контекст: server, location

Указывает режим доступа с которым будут созданы временные файлы.


синтаксис: upload_set_form_field <имя> <значение>
значение по-умолчанию: нет
строгость: необязательная
контекст: server, location

Задает поля формы, которые будут сгенерированы для каждого загружаемого файла в теле запроса, передаваемого бакэнду. Как имя так и значение могут содержать переменные nginx, а так же следующие специальные переменные:

Эти переменные доступны только во время обработки соответствующей части тела запроса и не могут быть, например, записаны в лог.

пример:
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
		

синтаксис: upload_aggregate_form_field <имя> <значение>
значение по-умолчанию: нет
строгость: необязательная
контекст: server, location

Задает поля формы, содержащие агрегированные атрибуты файлы. Поля будут сгенерированы для каждого загружаемого файла в теле запроса, передаваемого бакэнду. Как имя так и значение могут содержать переменные nginx, переменные директивы upload_set_form_field, а так же следующие дополнительные переменные:

Значение поля, задаваемого данной директивой вычисляется после успешной загрузки файла, таким образом, перечисленные переменные верны только в конце разбора части оригинального тела запроса.

ВНИМАНИЕ: переменные $upload_file_md5, $upload_file_md5_uc, $upload_file_sha1 и $upload_file_sha1_uc требуют дополнительного процессорного времени для вычисления MD5 и SHA1 сумм.

пример:
upload_aggregate_form_field $upload_field_name.md5 "$upload_file_md5";
upload_aggregate_form_field $upload_field_name.size "$upload_file_size";
		

синтаксис: upload_pass_form_field <регулярное выражение>
значение по-умолчанию: нет
строгость: необязательная
контекст: location

Задает регулярное выражение для имен полей, которые будут пропущены от клиента к бакэнду. Эта директива может повторяться произвольное число раз для одного location'а. Поле будет передано бакэнду если его имя совпадет с любым из регулярных выражений. Для сред, где недоступен PCRE, эта директива задает точное имя поля для передачи бакэнду. Если директива опущена, то ни одно поле не будет передано бакэнду из оригинального запроса.

пример:
upload_pass_form_field "^submit$|^description$";

Для сред, где недоступен PCRE:

upload_pass_form_field "submit";
upload_pass_form_field "description";
		

синтаксис: upload_cleanup <HTTP статус/промежуток статусов> [<HTTP статус/промежуток статусов>...]
значение по-умолчанию: нет
строгость: необязательная
контекст: server, location

Указывает HTTP-статусы, после получения которых все файлы, успешно загруженные в текущем запросе, будут удалены. Бакэнд может явно сигнализировать ошибочный статус чтобы удалить файлы, если они по какой-то причине оказались ему не нужны. Статус должен задаваться числом в промежутке от 400 до 599, лидирующие нули запрещены. При указании промежутка статусы разделяются символом - (минус).

пример:
upload_cleanup 400 404 499 500-505;

синтаксис: upload_buffer_size <длина>
значение по-умолчанию: размер страницы памяти в байтах
строгость: необязательная
контекст: server, location

Размер буфера, который будет использован для записи данных на диск.


синтаксис: upload_max_part_header_len <размер>
значение по-умолчанию: 512
строгость: необязательная
контекст: server, location

Указывает размер буфера, который будет использован для аккумулирования заголовка части тела запроса. Если заголовок не помещается в буфер, то запрос считается некорректным.


синтаксис: upload_max_file_size <размер>
значение по-умолчанию: нет
строгость: необязательная
контекст: main, server, location

Указывает максимальный размер загружаемого файла. Все файлы длинее указанного размера пропускаются. Эта директива задает "мякгое" ограничение, в том смысле, что при обнаружении файла длинее указанного размера, nginx не остановит обработку запроса, а попытается принять файлы из оставшихся его частей. Для "жесткого" ограничения должна применяться директива client_max_body_size. Значение 0 для директивы upload_max_file_size означает, что размер файла не нужно ограничивать.


синтаксис: upload_max_output_body_len <размер>
значение по-умолчанию: 100k
строгость: необязательная
контекст: main, server, location

Указывает максимальный размер тела результативного запроса. Предотвращает переполнение памяти нефайловыми полями запроса. Если тело результативного запроса превышает указанное ограничение, то выдается ошибка 413 (Request entity too long). Значение 0 для директивы upload_max_output_body_len означает, что размер тела результативного запроса не нужно ограничивать.


синтаксис: upload_tame_arrays <on/off>
значение по-умолчанию: off
строгость: необязательная
контекст: main, server, location

Указывает, нужно ли отбросить завершающие квадратные скобки в названиях полей (необходимо для работы массивов в PHP).


синтаксис: upload_limit_rate <скорость>
значение по-умолчанию: 0
строгость: необязательная
контекст: main, server, location

Задает ограничение скорости загрузки в байтах в секунду. Если задано значение, равное 0, то скорость не ограничена.


синтаксис: upload_pass_args <on/off>
значение по-умолчанию: off
строгость: необязательная
контекст: main, server, location

Разрешает передачу аргументов исходного запроса локейнешу, указанному директивой upload_pass. Директива upload_pass_args неприменима к именованым локейшенам. Пример:

<form action="/upload?id=5">

...

location /upload {
    upload_pass /internal_upload;
    upload_pass_args on;
}

...

location /internal_upload {
    ...
    proxy_pass http://backend;
}

В этом примере бакэнд получает URI запроса "/upload?id=5". В случае upload_pass_args off бакэнд получит "/upload".


Пример конфигурации

server {
    client_max_body_size 100m;
    listen       80;

    # Upload form should be submitted to this location
    location /upload {
        # Pass altered request body to this location
        upload_pass   @test;

        # Store files to this location
        upload_store /tmp;

        # Set specified fields in request body
        upload_set_form_field $upload_field_name.name "$upload_file_name";
        upload_set_form_field $upload_field_name.content_type "$upload_content_type";
        upload_set_form_field $upload_field_name.path "$upload_tmp_path";

        # Inform backend about hash and size of a file
        upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
        upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";

        # Pass matching fields from client to backend
        upload_pass_form_field "^submit$|^description$";

        upload_cleanup 400 404 499 500-505;
    }

    # Pass altered request body to a backend
    location @test {
        proxy_pass   http://localhost:8080;
    }
}
        

Пример формы для загрузки файлов

<html>
<head>
<title>Test upload</title>
</head>
<body>
<h2>Select files to upload</h2>
<form name="upload" method="POST" enctype="multipart/form-data" action="/upload">
<input type="file" name="file1"><br>
<input type="file" name="file2"><br>
<input type="file" name="file3"><br>
<input type="file" name="file4"><br>
<input type="file" name="file5"><br>
<input type="file" name="file6"><br>
<input type="submit" name="submit" value="Upload">
<input type="hidden" name="test" value="value">
</form>
</body>
</html>
        

Скачать

Последняя версия 2.2.0: tar.gz zip
Версия 2.0.12: tar.gz zip
Версия 2.0.11: tar.gz zip
Версия 2.0.10: tar.gz zip
Версия 2.0.9: tar.gz zip
Версия 2.0.8: tar.gz zip MD5 SHA1
Версия 2.0.7: tar.gz zip MD5 SHA1
Версия 2.0.6: tar.gz zip MD5 SHA1
Версия 2.0.5: tar.gz zip MD5 SHA1
Версия 2.0.4: tar.gz zip MD5 SHA1
Версия 2.0.3: tar.gz zip MD5 SHA1
Версия 2.0.2: tar.gz zip MD5 SHA1
или перейти в каталог загрузки

Репозиторий

http://github.com/vkholodkov/nginx-upload-module/tree/2.2

Документация более ранних версий

Версия 2.0.12
Версия 2.0.11
Версия 2.0.10
Версия 2.0.9
Версия 2.0.8
Версия 2.0.7
Версия 2.0.6
Версия 2.0.5
Версия 2.0.4
Версия 2.0.3
Версия 2.0.2

Как использовать

Скачать исходники по ссылке выше.

tar xvzf nginx_upload_module-2.2.0.tar.gz

Сконфигурировать nginx с дополнительным модулем:

Для nginx версий, отличных от 0.7.44-51:
cd <путь к исходникам nginx>
./configure --add-module=<путь к исходникам модуля>
make
make install
Для nginx версий 0.7.44-51:
cd <путь к исходникам nginx>
CFLAGS="-Dnginx_version=7052" ./configure --add-module=<путь к исходникам модуля>
make
make install

Nginx

nginx -- это веб-сервер разработанный Игорем Сысоевым.

Лицензия

Описанный модуль является дополнением к веб-серверу nginx и является самостоятельным продуктом. Лицензия описанного модуля BSD Вы должны были получить копию лицензии вместе с исходными кодами модуля. Используя материалы с этого сайты Вы автоматически соглашаетесь с условиями этой лицензии. Если Вы не согласны с условиями этой лицензии, Вы обязаны немедленно удалить с Вашего компьютера все материалы полученные с этого сайта.

Связаться с автором

Valery Kholodkov valery+nginx@grid.net.ru
Пожалуйста, используйте расширение адреса при составлении письма мне.


Copyright (C) 2006, 2008-2010 Valery Kholodkov
Отметки о копирайте модуля см. в исходных кодах модуля.