Multer没有看到上传的图片

时间:2017-08-28 18:15:47

标签: javascript node.js mongodb express multer

我希望在单个帖子请求中保存一个图像,这将是用户对MongoDB的化身,还有一些用户的信息,使用来自npm的名为multer的软件包。不幸的是,只有我在控制台中看到的是错误: TypeError: Cannot read property 'path' of undefined

register.pug

extends layout
block content
   h1 Register
   form(method='POST', action='/users/register')
    .form-group
      label Username:
      input.form-control(name='firstName', type='text')
    .form-group
      label Email:
      input.form-control(name='lastName', type='text')
    .form-group
      label Name:
      input.form-control(name='email', type='text')
    .form-group
      label Password:
      input.form-control(name='password', type='password')
    .form-group
      label Avatar:
      input.file(name='avatar', id='avatar' type='file')
    input.btn.btn-primary(type='submit',value='Submit')

注册路线

const upload = multer({ dest: 'uploads/avatars/' })
router.post('/register', upload.single('avatar'), (req, res, next) =>{
  const firstName = req.body.name;
  const lastName = req.body.name;
  const email = req.body.name;
  const password = req.body.name;
  let avatar = {
    path: req.file.path,
    orginalname: req.file.orginalname
  };

 let newUser = new User ({
   firstName: firstName,
   lastName: lastName,
   email: email,
   password: password,
   avatar: avatar
 });
}

newUser.save();
});

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:2)

呃,花了一段时间,但我找到了原因,你需要给你的文件一个 扩展名 。我会把我的代码放在这里

这是我的 html 文件,我在我的应用中使用ejs个模块,而不是jade

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form accept="image/x-png,image/gif,image/jpeg" enctype="multipart/form-data" action="/profile" method="post">
      <input type="file" name="avatar" value="">
      <input type="submit" name="" value="ssss">
    </form>
  </body>
</html>

这是我的app.js,如果cb函数中的目标路径不存在,它会为您创建目录。

然后是文件名,你需要给它一个扩展名,它可能像我一样.png,或者你可以做.jpeg,但是你喜欢,但它必须是 图片扩展程序 。或者您可以为其提供 扩展 ,即客户提供

然后我们有upload变量,它只为我们设置了预先要求的功能。

var express = require('express')
var multer  = require('multer')
var app = express()

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, __dirname + '/uploads')      //you tell where to upload the files,
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now() + '.png')
  }
})

var upload = multer({storage: storage,
    onFileUploadStart: function (file) {
      console.log(file.originalname + ' is starting ...')
    },
});

app.set('view engine', 'ejs');

app.get('/', function(req, res, next){    
    res.render('mult');  //our html document
})

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file
  console.log(req.file);
  return false;
})

答案 1 :(得分:1)

我相信你错过了这个属性

enctype="multipart/form-data"

在你的表格中,试一试!