使用multer快速上传文件

时间:2018-08-01 10:56:04

标签: node.js mongodb express mongoose

我正在尝试使用multer上传图片,但出现错误,上传不是功能。这是我的代码

var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single('image'), function(req, res) {
  console.log(req.file);
var file = __dirname + '/' + req.file.filename;
  uploads(req.file.path, file, function(err) {
    if (err) {
      console.log(err);
      res.send(500);
    } else {
      res.json({
        message: 'File uploaded successfully',
        filename: req.file.filename
      });
    }
  });

4 个答案:

答案 0 :(得分:0)

var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single('image'), function(req, res) {

 yourModel.create(req.body,function(err,result){
   console.log(result);
 });

});

答案 1 :(得分:0)

正如@Kuldeep所说,您不必进入路线内的uploads(filePath, file, (err) => {...})

当您将multer用作中间件(中间功能)时,multer会自动上传文件并将文件名,originalName等公开给路由内的req.file对象

var multer = require('multer');
var uploads = multer({dest: './images'});
app.post('/uploading', uploads.single('image'), function(req, res) {
// here just write the success or error login

}); 

参考您可以在这里查看:here

编辑:上面的代码将以十六进制字符串作为文件名的文件上传,没有任何扩展名。

要添加重命名功能,您需要使用diskStorage。这是从this github issue页获取的代码。

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './images/')
  },
  filename: function (req, file, cb) {
    crypto.pseudoRandomBytes(16, function (err, raw) {
      cb(null, raw.toString('hex') + Date.now() + '.' + mime.extension(file.mimetype)); //this is the rename func
    });
  }
});
var uploads = multer({ storage: storage });

现在,您可以使用uploads变量作为中间件,如上面的代码片段所示。

答案 2 :(得分:0)

这很明显; 上传不是功能,但升级是。因此,使用

upload.single('image')

答案 3 :(得分:0)

我还没有找到关于使用Multer的详尽指南(该网站对新手来说有点缺乏),所以这是我的目标。

使用后:

npm install multer --save 

将其添加到您的项目中。

对我来说,我想捕获特定路径上的文件,即:

/customers/:id/upload

因此,我进入了customer.js路由文件并添加了:

var multer = require('multer');

,以及用于设置存储(diskStorage)和文件名配置的代码:

var storage=multer.diskStorage({
  destination: function(req,file,cb){
    cb(null,'/uploads/');
  },
  filename: function(req,file,cb){
    cb(null,file.fieldname+'-'+Date.now());
  }
});

然后我可以创建上传中间件对象,该对象使我可以按路线指定我希望Multer处理文件上传的方式。在上述路由中,我只想接收一个具有特定内部文件名的文件,因此我的customer.js路由文件如下所示:

router.post('/:id/targets/upload', upload.single('connections'), function(req,res,next){
  console.log("Router:POST: Companies/:_id/upload");
  console.log(req.file);
  ...
});

我看到的所有示例都将某些内容添加到app.js文件中,但是这些示例看起来有些笨拙,并且被设计为示例。每条路由可能都有不同的文件处理需求,因此,对我来说,按控制器配置Multer似乎更合适。 YMMV。