J'utilise Node.js et express.
Je voudrais limiter la taille de la requête HTTP. Disons que si quelqu'un m'envoie une requête HTTP de plus de 2 Mo, j'arrête immédiatement la requête. J'ai regardé le code et je pense que si je change le noyau, je peux le faire. Cependant, y a-t-il un moyen de définir un max_request_size
ou quelque chose comme ça?
C'est un peu lié à ma deuxième question. J'utilise express pour obtenir un fichier téléchargé à partir de req.files
. Existe-t-il un moyen d'arrêter d'écrire le fichier dans le dossier /tmp
(qui est le comportement de téléchargement par défaut) dès que la taille du fichier dépasse une certaine taille?
Juste une mise à jour (07-2014), car je ne peux pas ajouter de commentaires:
Comme indiqué plus haut, les versions Express les plus récentes déconseillent l'utilisation du middleware limit
et le fournissent désormais sous la forme d'une option intégréepour le middleware BodyParser
:
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.json({ limit: '5mb' }))
Express utilise Connect, qui a un middleware limite disponible . Vous pouvez utiliser cela dans votre application Express en procédant comme suit:
app.use(express.limit('2mb'));
Cela limiterait par exemple toutes les requêtes HTTP à 2 Mo. Étant donné que les fichiers téléchargés font partie de la requête HTTP, tout téléchargement de fichier supérieur à 2 Mo serait également abandonné.
NOTE: Ce middleware est obsolète et sera bientôt supprimé. Vous pouvez en discuter à l’adresse suivante: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726
Code source du noeud 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
Donc, vous devez reconstruire le noeud à partir de la source pour dépasser la limite de 80 * 1024
Vous pouvez utiliser ceci avec Express 4 pour limiter la taille du corps de la requête/la taille du fichier de téléchargement, au lieu de express.json () et express.urlencoded (), vous devez exiger le module body-parser et utiliser ses méthodes json () et urlencoded (). , si l’option étendue n’est pas explicitement définie pour bodyParser.urlencoded (), un avertissement est émis (analyseur de corps obsolète, modèle indéfini étendu: fourniture étendue).
var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
Utilisez raw-body
. La plupart des middleware (comme limit) ne sont plus fournis avec Express et doivent être installés séparément. Voici un exemple.
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 ne vous permet plus de définir explicitement la limite à l'aide du middleware traditionnel fourni, comme indiqué ci-dessous.
app.use(express.limit('4M'));
Réponse pour la question 1 :
Pour limiter la taille de la requête HTTP et la taille du fichier de téléchargement, nous devons définir la limite body-parser
.
app.use(bodyParser.urlencoded({limit: '50mb',extended: true}));
app.use(bodyParser.json({limit: '50mb'}));
bodyParser.urlencoded
Les fichiers du front-end se présentent sous forme de corps encodés.
Renvoie le middleware qui analyse uniquement les corps codés par URL. Cet analyseur accepte uniquement le codage UTF-8 du corps et prend en charge le gonflage automatique des codages gzip et deflate.
Un nouvel objet body contenant les données analysées est rempli sur l'objet requête après le middleware (c'est-à-dire req.body). Cet objet contiendra des paires clé-valeur, où la valeur peut être une chaîne ou un tableau (lorsque étendu est false) ou tout type (lorsque étendu est vrai).
bodyParser.json
Renvoie le middleware qui analyse uniquement json. Cet analyseur accepte tout codage Unicode du corps et prend en charge le gonflage automatique des codages gzip et deflate.
Un nouvel objet body contenant les données analysées est rempli sur l'objet requête après le middleware (c'est-à-dire req.body).
Remarque : Par défaut, la limite d'entrée pour l'analyseur de corps est 100kb
Réponse à la question 2 :
Pour changer le répertoire de téléchargement par défaut, nous pouvons utiliser ce qui suit.
app.set('uploadDir', './files'); // Sets the upload Directory to files folder in your project.
Autre implémentation
Tout en incluant le bodyParser dans l'application, nous pouvons mentionner le répertoire de téléchargement.
app.use(express.bodyParser({uploadDir:'./files', keepExtensions: true}));
Référence :
Issues : https://github.com/expressjs/express/issues/1684
J'espère que cela t'aides!