【问题标题】:multer - req.file is undefined.multer - req.file 未定义。
【发布时间】:2018-08-06 21:49:42
【问题描述】:

我正在使用 Node、Express 和 Handlebars 以及 multer 创建一个应用程序来上传图像。每次我提交表单时, req.file 都是未定义的。我花了一整天的时间进行故障排除,但无法弄清楚我做错了什么。

路由器文件:

const express = require('express');
const router = express.Router();
const multer = require('multer');
const mongoose = require('mongoose');
const path = require('path');
const methodOverride = require('method-override');


//Set Storage Engine
const storage = multer.diskStorage({
    destination: './public/uploads/images',
    filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + 
    path.extname(file.originalname));
    }
});

const upload = multer({
    storage: storage
}).single('featuredImage');

//Change Featured Image - POST
router.post('/saveImage/:id', (req, res) => {
    console.log(req.file);

    //removed the rest of the code to keep it simple. req.file here is always undefined.

});

表格

<form action="/saveImage/{{pitch.id}}" method="POST" enctype="multipart/form-data">

    <div class="form-group">
        <label for="featuredImage">Featured Image</label>
         <input type="file" name="featuredImage" id="featuredImage">
     </div>

     <input type="submit" value="SAVE">
</form>

app.js 这些要求位于 app.js 文件中。

const express = require('express');
const exphbs  = require('express-handlebars');
const path = require('path');
const passport = require('passport');
const mongoose = require('mongoose'); 
const bodyParser = require('body-parser');
const flash = require('connect-flash');
const session = require('express-session');
const methodOverride = require('method-override');
const nodemailer = require('nodemailer');

//Set StaticFolder
app.use(express.static(path.join(__dirname, 'public')));

【问题讨论】:

  • 需要在 api 路由中添加中间件。
  • 根据git问题,即使你使用upload.single(),你也会在req.files而不是req.file得到文件所以尝试req.files并回发
  • @sidgujrathi 你错了我的朋友。仍然是req.filedocs
  • 是的,它仍然是 req.file。无论如何尝试 req.files 并且它是未定义的。

标签: node.js express multer


【解决方案1】:

你必须通过中间件

router.post('/saveImage/:id', upload.single('featuredImage'),  (req, res) => {
    console.log(req.file);

});

【讨论】:

    【解决方案2】:

    就我而言,这是图像大小的问题。我通过定义 multer 限制来解决它,如下所示:

    const upload = multer({ storage: storage, limits: { fieldSize: 10 * 1024 * 1024 } }); //10MB
    

    我花了很长时间才弄明白。 也许这可以帮助某人

    【讨论】:

      【解决方案3】:

      使用这个:

      var fileupload = require("express-fileupload");
      app.use(fileupload());
      

      【讨论】:

        【解决方案4】:

        您需要添加upload.single('featuredImage') 作为相应路由的中间件,如下所示。

        const upload = multer({storage: storage});

        //Change Featured Image - POST
        router.post('/saveImage/:id',upload.single('featuredImage'), (req, res) => {
            console.log(req.file);
        
           //removed the rest of the code to keep it simple. req.file here is always undefined.
        
        });
        

        【讨论】:

        • 非常感谢您的帮助。我试过了,但我得到了错误:TypeError:upload.single 不是函数。
        • @Uzair 你必须把const upload = multer({ storage: storage }).single('featuredImage');这个改成const upload = multer({ storage: storage })
        • 现在我得到了 console.log(req.file) 的值,但是我得到了上传不是函数的错误。一些改进!哈哈谢谢! :D
        • 修复了这个问题。我正在使用upload.single('featuredImage')不需要的附加上传功能。非常感谢您的帮助! :D
        【解决方案5】:

        请参考这个问题。它有您正在寻找的答案。

        node js multer file upload not working. req.file and req.files always undefined

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-02
          • 2022-01-18
          • 1970-01-01
          • 2020-12-17
          • 2016-06-21
          • 2017-01-15
          • 2017-01-26
          • 1970-01-01
          相关资源
          最近更新 更多