Node.js:如何限制HTTP请求大小和上传文件大小?

时间:2012-01-29 00:52:41

标签: node.js file-upload size express http-request

我正在使用Node.js并表达。

我想限制HTTP请求的大小。假设有人向我发送超过2 MB的HTTP请求,那么我立即停止请求。我查看了代码,我想如果我改变核心,我就可以做到。但是,有没有办法设置max_request_size或类似的东西?

这与我的第二个问题有关。我正在使用快递从req.files获取上传的文件。有没有办法在文件大小超过特定文件大小时立即停止将文件写入/tmp文件夹(这是默认的上载行为)?

7 个答案:

答案 0 :(得分:17)

只是更新(07-2014),因为我无法添加评论:

如上所述,较新的Express版本已弃用limit中间件,现在为BodyParser中间件提供 built-in option

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

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

答案 1 :(得分:10)

Express使用Connect,其中包含a limit middleware available。您可以通过执行以下操作在Express应用程序中使用此功能:

app.use(express.limit('2mb'));
例如,

将所有HTTP请求限制为2 MB。由于上传的文件是HTTP请求的一部分,因此任何大于2 MB的文件上传也将被中止。


注意:此中间件已弃用,很快就会被删除。有关为何情况的讨论,请访问:https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

答案 2 :(得分:7)

节点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 

因此,您需要从源重建节点以超过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}));

答案 3 :(得分:0)

使用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
  • 之后添加路由器

Express不再允许您使用传统的捆绑中间件显式设置限制,如下所示。

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

答案 4 :(得分:0)

回答问题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)之后,在请求对象上填充包含已解析数据的新body对象。此对象将包含键值对,其中值可以是字符串或数组(当扩展为false时)或任何类型(当扩展为true时)。

<强> bodyParser.json

返回仅解析json的中间件。此解析器接受正文的任何​​Unicode编码,并支持gzip和deflate编码的自动膨胀。

在中间件(即req.body)之后的请求对象上填充包含已解析数据的新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

希望这有帮助!

答案 5 :(得分:0)

对于不建议使用的更新解决方案,可以在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}));

答案 6 :(得分:0)

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