Ich versuche, einen einfachen Mechanismus zum Hochladen von Dateien mit Express 4.0 zum Laufen zu bringen, aber ich bin immer undefined
auf req.files
dem app.post
Laufenden. Hier ist der relevante Code:
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true }));
app.use(methodOverride());
//...
app.post('/fileupload', function (req, res) {
console.log(req.files);
res.send('ok');
});
.. und der dazugehörige Mops-Code:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")
Lösung
Dank der Antwort von mscdex unten habe ich busboy
anstelle von bodyParser
:
var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy());
//...
app.post('/fileupload', function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
fstream = fs.createWriteStream(__dirname + '/files/' + filename);
file.pipe(fstream);
fstream.on('close', function () {
res.redirect('back');
});
});
});
./files/
Verzeichnis im Home-Verzeichnis Ihrer App erstellen müssen, da sonst nach dem Hochladen eine Fehlermeldung angezeigt wird.Antworten:
Das
body-parser
Modul verarbeitet nur JSON- und urlencodierte Formularübermittlungen, keine mehrteiligen (was beim Hochladen von Dateien der Fall wäre).Für Multiparty müssten Sie etwas wie
connect-busboy
odermulter
oder verwendenconnect-multiparty
(Multiparty / Formidable ist das, was ursprünglich in der Express-BodyParser-Middleware verwendet wurde). Auch FWIW, ich arbeite an einer noch höheren Ebene über dem Busboy namensreformed
. Es wird mit einer Express-Middleware geliefert und kann auch separat verwendet werden.quelle
connect-busboy
statt nur verwenden musstebusboy
. Mein ursprünglicher Beitrag wurde mit der Lösung aktualisiert.connect-multiparty
beste Option davon!reformed
noch in der Entwicklung? Ihr letztes Commit für Github stammt aus dem Jahr 2014 ... Was ist Ihrer Meinung nach das beste Modul für den Umgang mit mehrteiligen Formulardaten? Mit "am besten" meine ich das am besten unterstützte und das, das besser funktioniert (weniger Fehler), mit mehr Funktionen und mit einer längeren Zukunft. Ich entschied mich,multer
weil es am besten unterstützt schien, aber ich denke immer noch, dass es mehr unterstützt werden sollte.Folgendes habe ich beim Googeln gefunden:
Welches ist ein ziemlich einfacher Mechanismus für Uploads
quelle
fileupload
?app.js
const fileUpload = require('express-fileupload') app.use(fileUpload())
Es sieht so aus, als
body-parser
hätte das Hochladen von Dateien in Express 3 unterstützt, aber die Unterstützung für Express 4 wurde eingestellt, als Connect nicht mehr als Abhängigkeit enthalten warNachdem ich einige der Module in der Antwort von mscdex durchgesehen hatte, stellte ich fest, dass dies
express-busboy
eine weitaus bessere Alternative war und einem Drop-In-Ersatz am nächsten kam. Die einzigen Unterschiede, die mir aufgefallen sind, waren die Eigenschaften der hochgeladenen Datei.console.log(req.files)
Mit Body-Parser (Express 3) wird ein Objekt ausgegeben, das folgendermaßen aussieht:im Vergleich zur
console.log(req.files)
Verwendung von Express-Busboy (Express 4):quelle
1) Stellen Sie sicher, dass Ihre Datei wirklich vom Client gesendet wird. Sie können dies beispielsweise in Chrome Console: Screenshot überprüfen
2) Hier ist das grundlegende Beispiel für das NodeJS-Backend:
quelle
multer ist eine Middleware, die "Multipart / Formulardaten" auf magische Weise verarbeitet und uns die hochgeladenen Dateien und Formulardaten auf Anfrage als request.files und request.body zur Verfügung stellt.
multer installieren: -
npm install multer --save
in der HTML-Datei: -
in der .js-Datei: -
Hoffe das hilft!
quelle
Bitte verwenden Sie den folgenden Code
quelle
PROBLEM GELÖST !!!!!!!
Es stellte sich heraus, dass die
storage
Funktion NICHT einmal ausgeführt wurde. da musste ich schließenapp.use(upload)
alsupload = multer({storage}).single('file');
quelle
express-fileupload
sieht aus wie die einzige Middleware, die heutzutage noch funktioniert.Mit dem gleichen Beispiel
multer
undconnect-multiparty
gibt einen undefinierten Wert von req.file oder req.files an , aberexpress-fileupload
funktioniert .Und es werden viele Fragen und Probleme bezüglich des leeren Werts von req.file / req.files aufgeworfen .
quelle