2016-09-20 4 views
4

Hier ist mein Problem, ich habe ein Formular, wo ich eine Datei und ein Feld einfügen kann, aber ich erhalte nur die Datei und nicht den Parameter test! Warum?Node.js, multer und req.body leer

Dies ist mein Code:

app.js:

var express = require('express'); 
var bodyParser = require('body-parser'); 
var app = express(); 
var port = 8000; 
var multer = require('multer'); // v1.0.5 
var storage =   multer.diskStorage({ 
  destination: function (req, file, callback) { 
    callback(null, './uploads'); 
  }, 
  filename: function (req, file, callback) { 
    callback(null, file.originalname.substring(0,file.originalname.lastIndexOf('.')) + '-' + Date.now() + file.originalname.substring(file.originalname.lastIndexOf('.'),file.originalname.length)); 
  } 
}); 
var upload = multer({ storage : storage}).single('fileUpload'); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

app.post('/api/upload',function(req,res){ 
    console.log(req.body); 
    upload(req,res,function(err) { 
        if(err) { 
            return res.end("Error uploading file."); 
        } 
        res.end("File is uploaded"); 
    }); 
}); 

app.listen(port, function() { 
    console.log('Express server inizializzato sulla porta ' + port); 
}); 

index.html:

<html> 
    <head> 
     <title>Test upload</title> 
    </head> 
    <body> 
     <form name="form" action="http://localhost:8000/api/upload" method="post" enctype="multipart/form-data"> 
      <input type="text" name="test" /> 
      <input type="file" name="fileUpload" /> 
      <input type="submit" value="invia" /> 
     </form> 
    </body> 
</html> 

Jemand kann mir helfen?

+0

Haben Sie versucht, 'erf. Körper? – abdulbarik

+0

@abdulbarik: ja, ich versuche, die req.body zurückgeben aber zurück {} – Filippo1980

+0

Es kann helfen http://stackoverflow.com/questions/35847293/uploading-a-file-and-passing-a-additional-parameter- mit-multer – abdulbarik

Antwort

5

2017 aktualisieren

From Readme

Beachten Sie, dass req.body vollständig noch bevölkert haben könnte nicht. Es hängt von der Reihenfolge ab, in der der Client Felder und Dateien an den Server sendet.

beschloß ich, mein Problem durch die Reihenfolge meiner Formularobjekteigenschaften im vorderen Ende Umkehren:

var newFormObj = new FormData(); 
    newFormObj.append('internalUserID', internalUserID); 
    newFormObj.append('listingImage', this.binaryImages[image]); 

im Backend:

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    console.log(req.body.internalUserID) // YAY, IT'S POPULATED 
    cb(null, 'listing-pics/') 
    },      
    filename: function (req, file, cb) { 
    cb(null, file.fieldname + '-' + Date.now()) 
    }      
});      

var upload = multer({ storage: storage }); 
+1

Ja, es funktioniert: thumbsup: – Nigilan

+0

warum habe ich einen leeren req.body? – leafiy

3

löse ich req.body am Ende der Post-Funktion bewegt:

app.post('/api/upload?:test',function(req,res){ 

    upload(req,res,function(err) { 
        if(err) { 
            return res.end("Error uploading file."); 
        } 
        res.end("File is uploaded"); 
    console.log(req.body); 

    }); 
}); 

Wenn jemand kann mir sagen, warum ich gerne eine neue Sache zu lernen! Aber für jetzt habe ich beschlossen!

+0

funktioniert es perfekt, aber warum? kann jemand das erklären? –

+1

Hei, Body-Parser behandelt nicht Multipart/Form-Daten Körper, aber Multer tut. Aus diesem Grund erhalten Sie nur Zugriff auf req.body innerhalb der Upload-Funktion. – Angie

+0

Danke @Angie für Ihre Antwort auf meine Zweifel! – Filippo1980