首页 > 解决方案 > 使用express在mongodb中插入带有表单数据的文件

问题描述

我试图将 .mp4 文件与其他一些信息一起上传到我的 mongodb 数据库。我可以使用 multer 和 gridfs 保存文件。我为此使用的代码:

// Create storage engine
const storage = new GridFsStorage({
    url: mongoURI,
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
                if (err) {
                    return reject(err);
                }
                const filename = buf.toString('hex') + path.extname(file.originalname);
                const fileInfo = {
                    filename: filename,
                    bucketName: 'vid'
                };
                resolve(fileInfo);
            });
        });
    }
});
const upload = multer({ storage });

router.post('/upload', upload.single('video'), (req, res) => {
    res.json({ file: req.file });
    // res.redirect('/');
});

为了将文件数据上传到数据库中,我正在这样做:

//ADD VIDEO
router.post('/addVideo', (req,res) => {
    var newVideo = new Video();

    newVideo._courseId = req.body.courseId;
    newVideo._chapterId = req.body.chapterId;
    newVideo.name = req.body.name;
    newVideo.des = req.body.des;

    newVideo.save((err,note) => {
        if(err){
            res.status(404).send({err: "Something went wrong"})
        } else {
            res.status(200).send({err: "Your note has been added!!"})
        }
    })
})

两个部分都运行良好,但我只需要对 addVideo 提出一个请求。在 addVideo 中,名称应与保存它的视频名称相同。我不知道如何合并此功能的两个代码。谢谢你。

标签: mongodbexpressmultipartform-datamulter-gridfs-storage

解决方案


多部分请求还支持发送纯数据。只需像这样添加upload.single('video')到中间件链中:

router.post('/addVideo', upload.single('video'), (req,res) => {
    // do something with req.file
    var newVideo = new Video();

    newVideo._courseId = req.body.courseId;
    newVideo._chapterId = req.body.chapterId;
    newVideo.name = req.body.name;
    newVideo.des = req.body.des;

    newVideo.save((err,note) => {
        if(err){
            res.status(404).send({err: "Something went wrong"})
        } else {
            res.status(200).send({err: "Your note has been added!!"})
        }
    })
})

现在棘手的部分是,在客户端上,您应该使用一种表单来发送文件和字段(名称、des 等)。您应该将所有字段放在表单上的文件之前。此外,此表格必须multipart/form-data用于上传工作。


推荐阅读