Node.js: как ограничить размер запроса HTTP и загрузить размер файла?

Я использую Node.js и выражаю.

Я хотел бы ограничить размер запроса HTTP. Скажем, если кто-то отправит мне HTTP-запрос более 2 МБ, я немедленно остановлю запрос. Я посмотрел на код, и я думаю, что если я изменю ядро, я смогу это сделать. Однако есть ли способ установить max_request_size или подобное?

Это относится к моему второму вопросу. Я использую выражение, чтобы загрузить загруженный файл из req.files. Есть ли способ прекратить запись файла в папку /tmp (которая является по умолчанию загрузкой), как только размер файла превышает определенный размер файла?

Ответ 1

Просто обновление (07-2014), так как я не могу добавлять комментарии:

Как было отмечено выше, более новые версии Express не рекомендовали использовать промежуточное программное обеспечение limit и теперь предоставляют его как встроенную опцию для промежуточного программного обеспечения BodyParser:

   var express    = require('express')
   var bodyParser = require('body-parser')

   var app = express()
   app.use(bodyParser.json({ limit: '5mb' }))

Ответ 2

Express использует Connect, у которого доступное промежуточное ПО. Вы можете использовать это в своем приложении Express, выполнив что-то вроде этого:

app.use(express.limit('2mb'));

Это, например, ограничило бы все HTTP-запросы до 2 МБ. Поскольку загруженные файлы являются частью HTTP-запроса, любая загрузка файла размером более 2 МБ также будет прервана.


ПРИМЕЧАНИЕ.. Это промежуточное программное обеспечение устарело и скоро будет удалено. Обсуждение того, почему это так, можно найти по адресу: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

Ответ 3

Исходный код node github:

/* Maximium header size allowed. If the macro is not defined
 * before including this header then the default is used. To
 * change the maximum header size, define the macro in the build
 * environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove
 * the effective limit on the size of the header, define the macro
 * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
 */
#ifndef HTTP_MAX_HEADER_SIZE
# define HTTP_MAX_HEADER_SIZE (80*1024)
#endif 

Итак, вам нужно перестроить node из источника, чтобы превзойти предел 80 * 1024

Вы можете использовать это с Express 4, чтобы ограничить размер тела запроса/размер файла загрузки, а не express.json() и express.urlencoded(), вы должны потребовать модуль body-parser и использовать его json() и urlencoded(), если расширенная опция явно не определена для bodyParser.urlencoded(), она будет вызывать предупреждение (body-parser устаревший undefined extended: предоставить расширенный вариант).

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

Ответ 4

Используйте raw-body. Большинство промежуточного программного обеспечения (например, лимит) больше не связаны с Express и должны устанавливаться отдельно. Вот пример.

var getRawBody = require('raw-body')
app.use(function (req, res, next) {
      getRawBody(
        stream = req,
        options = {
          length: req.headers['content-length'],
          limit: '100mb',
        },
        callback = function (err, reslt) {
          if (err) {
            return next(err)
          }
          next();
          console.log(req)
        })
    })
  • Не забудьте добавить маршрутизатор после app.use

Экспресс больше не позволяет вам явно устанавливать предел, используя традиционное связующее ПО, как показано ниже.

app.use(express.limit('4M'));

Ответ 5

Ответ на вопрос 1:

Чтобы ограничить размер запроса HTTP и загрузить размер файла, нам нужно установить предел body-parser.

app.use(bodyParser.urlencoded({limit: '50mb',extended: true}));
app.use(bodyParser.json({limit: '50mb'}));

bodyParser.urlencoded

Файлы с передней стороны поступают как urlencoded тела.

Возвращает промежуточное программное обеспечение, которое только анализирует urlencoded тела. Этот анализатор принимает только кодировку UTF-8 тела и поддерживает автоматическую инфляцию кодирования gzip и deflate.

Новый объект тела, содержащий проанализированные данные, заполняется объектом запроса после промежуточного ПО (т.е. req.body). Этот объект будет содержать пары ключ-значение, где значение может быть строкой или массивом (если расширено ложно) или любым типом (если расширено значение true).

bodyParser.json

Возвращает промежуточное программное обеспечение, которое обрабатывает только json. Этот анализатор принимает любую кодировку Unicode для тела и поддерживает автоматическую инфляцию gzip и дефляцию кодировок.

Новый объект тела, содержащий проанализированные данные, заполняется объектом запроса после промежуточного ПО (т.е. req.body).

Примечание: По умолчанию входной предел для синтаксического анализатора тела 100kb

Ответ на вопрос 2:

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

app.set('uploadDir', './files');  // Sets the upload Directory to files folder in your project.

Другая реализация

При включении bodyParser в приложение мы можем указать каталог загрузки.

app.use(express.bodyParser({uploadDir:'./files', keepExtensions: true}));

Ссылка:

Проблемы: https://github.com/expressjs/express/issues/1684

Надеюсь, это поможет!

Ответ 6

Для обновленного решения, которое не является устаревшим, вы можете добавить ограничение следующим образом в свой файл app.js:

app.use(express.json({limit: '2mb'}));
app.use(express.urlencoded({limit: '2mb', extended: false}));

Вы также можете сделать это так:

app.use(express.json({limit: 2000000}));
app.use(express.urlencoded({limit: 2000000, extended: false}));

Ответ 7

var methodOverride = require('method-override');
app.use(bodyParser.urlencoded({
        extended: true, limit: '50mb'
    }));
app.use(bodyParser.json({limit: '50mb'}));
app.use(methodOverride());