Express Multer req.files未定义

时间:2018-04-09 11:52:12

标签: node.js express multer

每当我上传图片时,req.files都会返回undefined。 这是我的代码:

 var upload123 = multer({
    dest: path.join(__dirname, 'public/upload/temp'),
  });

  app.post(upload123);

这是HTML:

<form action="/images" method="POST" enctype="multipart/form-data">
  <div class="panel-body form-horizontal">
    <div class="form-group col-md-12">
      <label for="file" class="col-md-2 control-label">Browse:</label>
      <div class="col-md-10">
        <input type="file" class="form-control" id="file" name="file">
      </div>
    </div>

这是我试图访问req.files的控制器:

create(req, res) {
const saveImage = function() {
  const possible = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let imgUrl = '';

  for(let i = 0; i < 6; i++) {
    imgUrl += possible.charAt(Math.floor(Math.random() * possible.length));
  }

  Models.Image.find({ filename: imgUrl }, (err, images) => {
    if (images.length > 0) saveImage();
    else {
      var tempPath = req.files.file.path,
      ext = path.extname(req.files.file.name).toLowerCase(),
      targetPath = path.resolve(`./public/upload/${ imgUrl }${ ext }`);

      if (ext === '.png' || ext === '.jpg' || ext === '.jpeg' || ext === '.gif') {
        fs.rename(tempPath, targetPath, (err) => {
          if (err) throw err;
          var newImg = new Models.Image({
            title: req.body.title,
            description: req.body.description,
            filename: imgUrl + ext
          });

          newImg.save((err, image) => {
            res.redirect(`/images/${image.uniqueId}`);
          });
        });
  } else {
    fs.unlink(tempPath, () => {
      if (err) throw err;
      res.json(500, {error: 'Only image files are allowed'});
    })
  }
    }
  });

}

saveImage();

}

我使用的是Express 4.16.3和Multer 1.3.0。 我查看了文档,但无法弄清楚如何在Multer中简单地提供dest选项。请帮忙,我是Nodejs的新手

1 个答案:

答案 0 :(得分:0)

这是代码正常工作的示例:

const multer = require('multer');
const storage = multer.memoryStorage();
const fileUpload = multer({storage});

app.use('/*', fileUpload.single('file'));

如果你在应用程序的开头有这个并且你把控制器放在这个中间件之后,那么在req.file你将有文件

最好的是它直接存储在内存中,而不是存储在某个文件中,因此您无需从文件系统加载它。 (这也更安全,尤其是当您将应用程序部署到某些云服务和容器时,这会使其不太明显)

如果您坚持使用&#34;磁盘上文件&#34;解决方案,基于官方文档:https://www.npmjs.com/package/multer您应该将其用作:

  var upload123 = multer({
    dest: path.join(__dirname, 'public/upload/temp'),
  });

  app.post('/endpoint/to/upload/photos', upload123.single('file'), controller.handleImage);