2017-06-21 6 views
0

J'utilise Multer pour analyser une forme multipart dans un environnement clé de voûte et et pas en mesure d'accéder aux données de req.body et req.file dans mon contrôleur de routeMulter ne peuplait req.body et req.file

routes/index.js

var keystone = require('keystone'), 
    middleware = require('./middleware'); 

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

//multi-part form parser for FTP api 
var multer = require('multer'); 
var storage = multer.memoryStorage(); 
var upload = multer({storage: storage}); 

exports = module.exports = function(app) { 
    app.use(bodyParser.json({limit: '10mb'})); 
    app.use(bodyParser.urlencoded({limit: '10mb', extended: true})); 
    app.post('/upload_api', upload.single('formFile'), routes.api.uploadFTP); 
}; 

routes/api/uploadFTP.js

var keystone = require('keystone'); 
var ftpMod = require('ftp'); 
var fs = require('fs'); 

exports = module.exports = function(req, res) { 
    console.log("req.body is "); 
    console.log(req.body); 
    console.log("req.file is "); 
    console.log(req.file); 
    res.send("console.log() outputted to screen"); 
} 

publique/test-Upload.html

<html> 
    <body> 
     <form name="sampleForm" enctype="multipart/form-data" action="/upload_api" method="post"> 
      <p>Method</p> 
      <input type="text" name="method"><br> 
      <p>Options</p> 
      <input type="text" name="options"><br> 
      <p>File</p> 
      <input type="file" name="formFile"><br><br> 
      <input type="submit" value="Click to Send"> 
     </form> 
    </body> 
</html> 

La réponse que je reçois de nodejs est

>req.body is 
{} 
req.file is 
undefined 

J'attends req.body contenir {méthode: « someText »} et req.file être peuplée

Répondre

0

Vous ne pouvez pas obtenir des valeurs dans les deux req.body ou req.file. Remplacez youe uploadFTP.js par le code ci-dessous.

var multer = require('multer'); 
var path = require('path'); 

var storage = multer.diskStorage({ 
    destination: function(req, file, callback) { 
    callback(null, <<path where you want to store your files>>); 
    }, 
    filename: function(req, file, callback) { 
    callback(null, path.basename(Date.now() + '_' + file.originalname)); 
    }, 
}); 
var maxSize = 1024 * 1024; 
var upload = multer({ 
    storage: storage, 
    fileFilter: function(req, file, callback) { 
    var ext = path.extname(file.originalname); 
    if(ext !== '.gif' && ext !== '.jpeg') { 
     return callback(res.status(202).end();, null); 
    } 
    callback(null, true); 
    }, 
    limits: {fileSize: maxSize}, 
}).single('image'); 

exports = module.exports = function (req, res) { 

    upload(req, res, function(err) { 
    console.log(storage.diskStorage); 
    if(err) { 
     return res.status(201).end(); 
    } 
    //Do stuff here 
    res.status(200).end(); 
    }); 
} 

Remplacer dessous de la ligne en index.js

app.post('/upload_api', upload.single('formFile'), routes.api.uploadFTP); 

avec

app.post('/upload_api', routes.api.uploadFTP); 
+0

Im confus sur la suppression de la 'upload.single ('FormFile')' middleware de index.js Je suis également confus par la fonction upload (req, res, function (err) {}): dans le fichier uploadFTP.js. Où est passé upload.single()? Tout cela semble très différent de la documentation fournie par express/multer – user258667

+0

L'exemple de code de la documentation est var multer = require ('multer'); var storage = multer.memoryStorage(); var upload = multer ({stockage: stockage}); App.post ('/ profile', upload.array(), fonction (req, res, next) { // req.body contient les champs de texte }); – user258667

+0

Ceci est le code de travail de mon application. Vous pouvez conserver Middleware si vous le souhaitez. J'ai appelé upload.Single() de la méthode réelle –