2012-01-29 53 views
9

Estoy usando Node.js y express.Node.js: cómo limitar el tamaño de la solicitud HTTP y el tamaño del archivo de carga?

Me gustaría limitar el tamaño de la solicitud HTTP. Digamos que si alguien me envía una solicitud HTTP de más de 2 MB, detengo la solicitud de inmediato. Miré el código y creo que si cambio el núcleo, puedo hacerlo. Sin embargo, ¿hay alguna manera de establecer un max_request_size o algo así?

Está relacionado con mi segunda pregunta. Estoy usando express para obtener un archivo cargado desde req.files. ¿Hay alguna manera de dejar de escribir el archivo en la carpeta /tmp (que es el comportamiento de carga predeterminado) tan pronto como el tamaño del archivo supera un determinado tamaño de archivo?

Respuesta

9

Express usa Connect, que tiene a limit middleware available. Puede utilizar esto en su aplicación Express de hacer algo como esto:

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

que, por ejemplo, podría limitar todas las peticiones HTTP a 2 MB. Como los archivos cargados son parte de la solicitud HTTP, cualquier archivo que cargue más de 2 MB también se cancelará.


NOTA: Este middleware es obsoleto y se eliminará en breve. La discusión sobre por qué este es el caso está disponible en: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

+0

si limito a 2MB, y envío una solicitud http de 1GB. ¿Se detendrá de inmediato si supera los 2 MB? o devuelve un error pero aún obtiene el resto de los datos de 0.998GB? – murvinlai

+5

La fuente está disponible en https://github.com/senchalabs/connect/blob/master/lib/middleware/limit.js. Si lo estoy leyendo correctamente, lee los datos fragmentados y finaliza la solicitud tan pronto como excede el límite de tamaño. –

+0

express.límite está en desuso en nodejs 6 como middleware – user1709076

14

Apenas una actualización (07 a 2014), ya que no soy capaz de añadir comentarios:

Como correctamente se señaló anteriormente, las nuevas versiones express han desaprobado la el uso de la limit middleware y ahora proporcionan como un built-in option para el middleware BodyParser:

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

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

Eso es lo que necesito. Gracias. – emj365

+0

no funciona para mí en el nodo 6 – user1709076

+0

cómo puedo aumentar el límite en caso de solicitud de módulo – 981

0

uso raw-body. La mayoría del middleware (como límite) ya no se incluye con Express y debe instalarse por separado. Aquí hay un ejemplo.

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) 
     }) 
    }) 
  • recuerde agregar el router después de la app.use

expreso ya no le permite establecer de forma explícita el límite usando el middleware incluido tradicional como se muestra a continuación.

0

respuesta para la pregunta 1:

Para limitar el tamaño de la petición HTTP y envío tamaño del archivo que necesita para establecer el límite body-parser.

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

bodyParser.urlencoded

Los archivos de la parte delantera se presenta como cuerpos urlencoded.

Devuelve un middleware que solo analiza cuerpos urlencoded. Este analizador acepta solo la codificación UTF-8 del cuerpo y admite el inflado automático de gzip y desinfla las codificaciones.

Un objeto de cuerpo nuevo que contiene los datos analizados se rellena en el objeto de solicitud después del middleware (es decir, req.body). Este objeto contendrá pares clave-valor, donde el valor puede ser una cadena o matriz (cuando se extiende es falsa), o cualquier tipo (cuando se extiende es verdadera).

bodyParser.json

devoluciones middleware que sólo analiza JSON. Este analizador acepta cualquier codificación Unicode del cuerpo y admite el inflado automático de gzip y desinfla las codificaciones.

Un objeto de cuerpo nuevo que contiene los datos analizados se rellena en el objeto de solicitud después del middleware (es decir, req.body).

Nota: Por defecto el límite de entrada para el analizador cuerpo es 100kb

respuesta a la pregunta 2:

Para cambiar el directorio de carga por defecto, podemos usar el siguiente.

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

otra implementación

Mientras incluyendo el bodyParser en la aplicación podemos mencionar el directorio de carga.

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

Referencia:

Problemas: https://github.com/expressjs/express/issues/1684

Espero que esto ayude!

+0

La pregunta n. ° 1 (y mi énfasis en la recompensa) es sobre el tamaño de la * solicitud. Pero su respuesta es sobre el tamaño del cuerpo de la solicitud *. Se menciona explícitamente en los enlaces de referencia que proporciona: "Controla el tamaño máximo de la solicitud". –

5

El código fuente de github nodo:

/* 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 

Por lo tanto, es necesario reconstruir el nodo de la fuente de superar el límite de 80 * 1024

Puede usar esto con Express 4 para limitar el tamaño solicitud cuerpo/Cargar tamaño de archivo, en lugar de express.json() y express.urlencoded(), debe requerir el módulo analizador de cuerpo y usar sus métodos json() y urlencoded(), si la opción extendida no está explícitamente definida para bodyParser. urlencoded(), arrojará una advertencia (analizador de cuerpo obsoleto indefinido extendido: proporcionar opción extendida).

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

La pregunta n. ° 1 (y mi énfasis en la recompensa) se refiere al tamaño de la solicitud. Pero su respuesta es sobre el tamaño del cuerpo de la solicitud. documenta que el parámetro límite "Controla el tamaño máximo del cuerpo de la solicitud". –

+0

Código fuente del nodo github:/* Se permite el tamaño del encabezado Maximium. Si la macro no está definida * antes de incluir este encabezado, entonces se usa el valor predeterminado: * cambio el tamaño máximo de encabezado, defina la macro en el entorno de compilación * (por ejemplo, -DHTTP_MAX_HEADER_SIZE = ). eliminar * el límite efectivo del tamaño del encabezado, defina la macro * en un número muy grande (p. -DHTTP_MAX_HEADER_SIZE = 0x7fffffff) */ #ifndef HTTP_MAX_HEADER_SIZE # define HTTP_MAX_HEADER_SIZE (80 * 1024) #endif ... Por lo tanto, es necesario reconstruir el nodo de la fuente de superar el límite de 80 * 1024 – AJS

Cuestiones relacionadas