【问题标题】:NPM Multer, alternative to onFileUploadCompleteNPM Multer,onFileUploadComplete 的替代品
【发布时间】:2016-03-20 22:15:19
【问题描述】:

我正在尝试将表单信息保存到猫鼬数据库中,同时上传文件。我尝试了各种示例,但似乎“onFileUploadComplete”选项已被删除。下面是代码:

router.post('/info', function(req, res, next){
    multer({ storage:
        multer.diskStorage({
            destination: function(req, file, callback){
                var path = "./public/assets";   
                switch(req.body.type)
                {
                    case 'link': path += '/link'; break;
                    case 'PDF': path += '/PDF'; break;
                    case 'video': path += '/video'; break;
                    case 'audio': path += '/audio'; break;
                    case 'image': path += '/image/' + req.body.folder; break;
                }
                callback(null, path);
            },
            filename: function(req, file, callback){
                callback(null, file.originalname);
            }
        }),
        onFileUploadComplete: function(req, file, callback){
            var asset = new Asset(req.body);
            asset.save(function(err, asset){
                if(err)
                    return next(err);

                return next();
            });
        }
    }).single('file')(req, res, function(err){
        if(err)
            return res.send("Err: "+ err);

        res.render('uploads', {authorised: true});
    });
});

有没有其他方法可以将文件上传到指定位置,并将表单信息(req.body)保存到数据库中。

任何帮助表示赞赏, 谢谢

【问题讨论】:

    标签: node.js mongoose multer


    【解决方案1】:

    您可以通过file.stream 访问可读文件流。所以你可以file.stream.on('end', ...) 知道文件何时完成读取。如果您想知道文件是否真的完成了到磁盘的写入,您需要做一些更老套的事情,例如:file.stream._readableState.pipes.on('finish', ...)

    但是,如果您想在文件完成后存储 req.body,为什么不简单地在您的路由处理程序中这样做,或者编写一个自定义的通用中间件来包装 multer 中间件这些东西在一个中间件中。例如:

    function myUpload(multUpload) {
      return function(req, res, next) {
        multUpload(req, res, function(err) {
          if (err) return next(err);
          // Save `req.body` to database here, then call `next()`
        });
      };
    }
    

    并像这样使用它:

    // Here `upload === multer({ ... })`
    router.post('/info', myUpload(upload.single('file')), function(req, res, next) {
      if (err)
        return res.send("Err: "+ err);
    
      res.render('uploads', {authorised: true});
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2022-07-16
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多