side - Node.js: cómo limitar el tamaño de la solicitud HTTP y subir el tamaño del archivo?
que es express js (5)
Express usa Connect, que tiene un middleware de límite disponible . Puede usar esto en su aplicación Express haciendo algo como esto:
app.use(express.limit(''2mb''));
Eso, por ejemplo, limitaría todas las solicitudes 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 está en desuso y pronto será eliminado. La discusión sobre por qué este es el caso está disponible en: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726
Estoy usando Node.js y express.
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 forma de establecer un max_request_size
o algo así?
Está relacionado con mi segunda pregunta. Estoy usando express para obtener un archivo cargado de archivos de 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?
Solo una actualización (07-2014), ya que no puedo agregar comentarios:
Como se indicó correctamente anteriormente, las versiones más recientes de Express han dejado de usar el middleware de limit
y ahora lo proporcionan como una opción incorporada para el middleware de BodyParser
:
var express = require(''express'')
var bodyParser = require(''body-parser'')
var app = express()
app.use(bodyParser.json({ limit: ''5mb'' }))
Use 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 enrutador después de la aplicación.
app.use
Express ya no le permite establecer explícitamente el límite utilizando el middleware agrupado tradicional como se muestra a continuación.
app.use(express.limit(''4M''));
Respuesta para la pregunta 1 :
Para limitar el tamaño de la solicitud HTTP y el tamaño del archivo de carga, debemos establecer el límite del body-parser
del body-parser
.
app.use(bodyParser.urlencoded({limit: ''50mb'',extended: true}));
app.use(bodyParser.json({limit: ''50mb''}));
bodyParser.urlencoded
Los archivos del frente vienen como cuerpos urlencoded.
Devuelve 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 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
Devuelve middleware que solo 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 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 corporal es de 100kb
Respuesta para la pregunta 2 :
Para cambiar el directorio de carga predeterminado, podemos usar lo siguiente.
app.set(''uploadDir'', ''./files''); // Sets the upload Directory to files folder in your project.
Otra implementación
Al incluir BodyParser en la aplicación, podemos mencionar el directorio de carga.
app.use(express.bodyParser({uploadDir:''./files'', keepExtensions: true}));
Referencia :
- https://github.com/expressjs/body-parser#limit
- https://github.com/expressjs/body-parser#bodyparserjsonoptions
- https://github.com/expressjs/body-parser#bodyparserurlencodedoptions
Problemas : https://github.com/expressjs/express/issues/1684
¡Espero que esto ayude!
Código fuente del nodo 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
Por lo tanto, debe reconstruir el nodo de la fuente para superar el límite de 80 * 1024
Puede usar esto con Express 4 para limitar el tamaño del cuerpo de la solicitud / Cargar tamaño de archivo, en lugar de express.json () y express.urlencoded (), debe requerir el módulo de analizador de cuerpo y usar sus métodos json () y urlencoded () , si la opción extendida no está definida explícitamente para bodyParser.urlencoded (), arrojará una advertencia (body-analizador obsoleto undefined extended: provide extended option).
var bodyParser = require(''body-parser'');
app.use(bodyParser.json({limit: ''50mb''}));
app.use(bodyParser.urlencoded({limit: ''50mb'', extended: true}));