36 Stimmen

Node.js: wie kann man die Größe von HTTP-Anfragen und die Dateigröße beim Hochladen begrenzen?

Ich benutze Node.js und Express.

Ich möchte die Größe der HTTP-Anfragen begrenzen. Angenommen, wenn mir jemand eine HTTP-Anfrage größer als 2 MB sendet, möchte ich die Anfrage sofort stoppen. Ich habe den Code angesehen und ich denke, wenn ich den Kern ändere, kann ich das tun. Gibt es jedoch eine Möglichkeit, eine max_request_size oder etwas Ähnliches festzulegen?

Das hängt irgendwie mit meiner zweiten Frage zusammen. Ich verwende Express, um eine hochgeladene Datei von req.files zu erhalten. Gibt es eine Möglichkeit, das Schreiben der Datei in den /tmp-Ordner (was das Standard-Uploadverhalten ist) sofort zu stoppen, sobald die Dateigröße eine bestimmte Größe überschreitet?

40voto

Gaston Punkte 810

Nur ein Update (07-2014), da ich keine Kommentare hinzufügen kann:

Wie oben korrekt angemerkt wurde, haben neuere Express-Versionen die Verwendung des limit-Middleware veraltet und bieten es jetzt als eingebaute Option für das BodyParser-Middleware an:

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

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

17voto

AJS Punkte 933

Quellcode des Knotens GitHub:

/* Maximale Headergröße erlaubt. Wenn die Makro nicht definiert ist
 * bevor dieser Header eingeschlossen wird, wird standardmäßig verwendet. Um
 * die maximale Headergröße zu ändern, definieren Sie das Makro in der Buildumgebung (z. B. -DHTTP_MAX_HEADER_SIZE=). Um
 * das effektive Limit für die Größe des Headers zu entfernen, definieren Sie das Makro
 * auf eine sehr große Zahl (z. B. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
 */
#ifndef HTTP_MAX_HEADER_SIZE
# define HTTP_MAX_HEADER_SIZE (80*1024)
#endif 

Also müssen Sie Knoten aus dem Quellcode neu erstellen, um das Limit von 80*1024 zu überschreiten

Sie können dies mit Express 4 verwenden, um die Anforderungsgröße/die Upload-Dateigröße zu begrenzen, anstelle von express.json() und express.urlencoded(), müssen Sie das body-parser-Modul erfordern und seine json() und urlencoded() Methoden verwenden, wenn die extended-Option nicht explizit für bodyParser.urlencoded() definiert ist, wird es eine Warnung ausgeben (body-parser wurde nicht definiert: geben Sie eine erweiterte Option an).

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

16voto

Rohan Singh Punkte 18670

Express verwendet Connect, das ein verfügbares Limit-Middleware hat. Sie können dies in Ihrer Express-App verwenden, indem Sie etwas Ähnliches tun:

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

Dadurch würden beispielsweise alle HTTP-Anfragen auf 2 MB begrenzt. Da hochgeladene Dateien Teil der HTTP-Anfrage sind, würde auch jeder Datei-Upload größer als 2 MB abgebrochen.


HINWEIS: Dieses Middleware ist veraltet und wird bald entfernt. Eine Diskussion darüber, warum dies der Fall ist, finden Sie unter: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

7voto

elarcoiris Punkte 1834

Für eine aktualisierte Lösung, die nicht veraltet ist, können Sie das Limit wie folgt in Ihrer app.js-Datei hinzufügen:

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

Sie können es auch so machen:

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

1voto

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X