【问题标题】:Multer is not populating req.body and req.fileMulter 没有填充 req.body 和 req.file
【发布时间】:2017-11-24 12:47:14
【问题描述】:

我正在使用 Multer 在 keystone 环境中解析多部分表单,但无法访问我的路由控制器内的 req.body 和 req.file 数据

路由/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");
}

public/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>

我从 nodejs 收到的响应是

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

我希望 req.body 包含 {method: "sometext"} 和req.file 被填充

【问题讨论】:

    标签: node.js express multer keystone form-processing


    【解决方案1】:

    您无法获取req.bodyreq.file 中的值。用下面给定的代码替换你的uploadFTP.js。

    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();
      });
    }
    

    在 index.js 中替换下面的行

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

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

    【讨论】:

    • 我对从 index.js 中删除 upload.single('formFile') 中间件感到困惑我也对 uploadFTP.js 文件中的函数 upload(req, res, function(err){}): 感到困惑。 upload.single() 去哪儿了?这一切似乎与 express/multer 提供的文档大不相同
    • 文档中的示例代码是 var multer = require('multer'); var storage = multer.memoryStorage(); var upload = multer({ storage: storage }); app.post('/profile', upload.array(), function (req, res, next) { // req.body 包含文本字段 });
    • 这是我的应用程序的工作代码。如果你愿意,你可以保留中间件。我已经从实际方法中调用了 upload.Single()
    • 谢谢你的例子。它不工作。该文件没有放在我期望的位置,我仍然无法访问 req.file 或 req.body.method
    猜你喜欢
    • 2020-10-02
    • 2019-02-10
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2020-12-17
    • 2019-07-31
    • 2018-08-06
    相关资源
    最近更新 更多