it-swarm.com.de

Dateiupload mit Express 4.0: req.files undefined

Ich versuche, einen einfachen Mechanismus zum Hochladen von Dateien in Express 4.0 zu erhalten, aber ich erhalte undefined für req.files im app.post-Körper. Hier ist der entsprechende 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 Pug-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 auf busboy anstelle von bodyParser umgestellt:

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');
        });
    });
});
204
safwanc

Das Modul body-parser verarbeitet nur JSON- und urlencodierte Formularsendungen, nicht Multipart (was beim Hochladen von Dateien der Fall wäre).

Für Multipart benötigen Sie etwas wie connect-busboy oder multer oder connect-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 auf dem Busboy namens reformed . Es wird mit einer Express-Middleware geliefert und kann auch separat verwendet werden.

195
mscdex

Hier habe ich googeln gefunden:

var fileupload = require("express-fileupload");

Welches ist ein ziemlich einfacher Mechanismus für Uploads 

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    file.mv("file.txt", function(err)  //Obvious Move function
        {
              // log your error
        });

    res.send("File Uploaded");


});
13
Anton Stafeyev

Es sieht so aus, als würde body-parserdid das Hochladen von Dateien in Express 3 unterstützen, aber die Unterstützung für Express 4 wurde eingestellt, als nicht mehr enthalten. Verbinden als Abhängigkeit

Nachdem ich einige der Module in der Antwort von mscdex durchgesehen hatte, stellte ich fest, dass express-busboy eine weitaus bessere Alternative war und einem Drop-in-Ersatz am nächsten kam. Die einzigen Unterschiede, die ich bemerkte, waren die Eigenschaften der hochgeladenen Datei.

console.log(req.files) mit body-parser (Express 3) gab ein Objekt aus, das folgendermaßen aussieht:

{ file: 
   { fieldName: 'file',
     originalFilename: '360px-Cute_Monkey_cropped.jpg',
     name: '360px-Cute_Monkey_cropped.jpg'
     path: 'uploads/6323-16v7rc.jpg',
     type: 'image/jpeg',
     headers: 
      { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"',
        'content-type': 'image/jpeg' },
     ws: 
      WriteStream { /* ... */ },
     size: 48614 } }

im Vergleich zu console.log(req.files) mit express-busboy (Express 4):

{ file: 
   { field: 'file',
     filename: '360px-Cute_Monkey_cropped.jpg',
     file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg',
     mimetype: 'image/jpeg',
     encoding: '7bit',
     truncated: false
     uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }
10
HPierce

multer ist eine Middleware, die "multipart/form-data" magisch verwaltet und 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: -

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

in .js-Datei: -

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

Hoffe das hilft!

5
Parth Raval

Bitte verwenden Sie den folgenden Code 

app.use(fileUpload());
1
Gaurav kumar

1) Stellen Sie sicher, dass Ihre Datei wirklich vom Client aus gesendet wird. Sie können es beispielsweise in Chrome Console überprüfen: screenshot

2) Hier ist das grundlegende Beispiel für das NodeJS-Backend:

const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

app.use(fileUpload()); // Don't forget this line!

app.post('/upload', function(req, res) {
   console.log(req.files);
   res.send('UPLOADED!!!');
});
1
Dmitry Kulahin

PROBLEM GELÖST !!!!!!!

Stellt fest, dass die storage-Funktion DID NICHT einmal ausgeführt wird. weil ich app.use(upload) als upload = multer({storage}).single('file'); angeben musste

 let storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './storage')
          },
          filename: function (req, file, cb) {
            console.log(file) // this didn't print anything out so i assumed it was never excuted
            cb(null, file.fieldname + '-' + Date.now())
          }
    });

    const upload = multer({storage}).single('file');
0
Sharl Sherif