首页 > 解决方案 > mongoose 删除之前上传的文件

问题描述

我正在使用 multer 从客户端上传文件,使用的格式非常好。我还实现了 editRouter 来编辑帖子内容。因此,如果我在编辑表单中上传文件,该文件也会被上传并更新帖子。但是,以前的文件仍保留在服务器上。删除帖子时也有类似的问题。在这种情况下,如何确保之前上传的文件也被删除?

postRouter.js

postRouter.route('/:postId/edit')
.put(authenticate.verifyUser, upload.single('image'), (req, res, next) => {
    if(req.file)
    {
        req.body.image = req.file.filename;
    }

    Posts.findByIdAndUpdate(req.params.postId, { $set: req.body }, {new: true})
    .then((post) => {
        console.log('The post has been edited successfully');
        res.statusCode = 200;
        res.setHeader('Content-Type','text/html');
        res.redirect('/post/'+post._id+'/view');
    }, (err) => next(err))
    .catch((err) => next(err));
});

postRouter.route('/:postId/view')
.delete(authenticate.verifyUser, (req,res,next) => {
    Posts.findByIdAndRemove(req.params.postId)
    .then((resp) => {
        console.log('Post with id: '+req.params.id+' removed!');
        res.statusCode = 200;
        res.setHeader('Content-Type','text/html');
        res.redirect('/');
    }, (err)=>next(err))
    .catch((err) => next(err));
});

请帮忙!谢谢!

标签: node.jsmongoosefile-upload

解决方案


您可以使用提供的unlink方法在保存新文件之前node fs删除文件。

通过使用这种方法,您需要确保您正在删除要删除的文件,因为验证将有很长的路要走。

fs.unlink('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was deleted');
});

我建议你files根据一些唯一的 id 来命名你的名字,可能是_id或者PostID来自猫鼬,这样你最有可能删除正确的。

如果您需要帮助,请查看此答案,例如如何使用 multer 重命名文件。


推荐阅读