Node.js 使用multer在express中上载文件

Node.js 使用multer在express中上载文件,node.js,mongodb,express,mongoose,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.filena

我试图上传图像使用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
      });
    }
  });

正如@Kuldeep所说,您不必在路由中上传
(filePath,file,(err)=>{…})

当您使用multer作为中间件(中间功能)时,multer将自动上载文件,并将文件名、原始名称等公开给路由内的
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

}); 
您可以在此处查看参考资料:

编辑:以上代码将上载文件名为十六进制字符串的文件,不带任何扩展名。

要添加重命名功能,您需要使用
diskStorage
。这是取自第页的代码


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

非常明显上传不是一项功能,但上传是一项功能。所以使用

upload.single('image')

我还没有找到一个关于使用Multer的很好的指南(这个网站对于新手来说只是有点缺乏),所以这里是我的尝试

使用后:

npm install multer --save 
将其添加到项目中

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

/customers/:id/upload
因此,我进入customers.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如何处理文件上传。在上面的路由中,我只想接收一个具有特定内部文件名的文件,因此我的customers.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.

文件名已显示,但如何上载图像并将名称保存到数据库?模型表示您的收藏名称您可以在此处直接调用您的收藏db.yourcollectionnameimage未上载,将存储具有任何字符串名称的文件这是图像:)这是默认行为。只需添加一个扩展并打开它。为了更好地理解,我添加了重命名函数的代码。
var storage=multer.diskStorage({
  destination: function(req,file,cb){
    cb(null,'/uploads/');
  },
  filename: function(req,file,cb){
    cb(null,file.fieldname+'-'+Date.now());
  }
});
router.post('/:id/targets/upload', upload.single('connections'), function(req,res,next){
  console.log("Router:POST: Companies/:_id/upload");
  console.log(req.file);
  ...
});