当我删除包含该映像的发布时,如何从磁盘删除该映像?



可能这个问题不是很清楚,所以我将解释得更好。我已经创建了一个应用程序,在那里我可以创建有标题,内容和图像的文章。将图像与multer一起上传到名为../frontend/public/uploads/post的目录下的根文件夹。当我创建帖子时,与这些帖子一起上传的图像被保存在这个文件夹中。问题是,当我删除帖子时,图像并没有与帖子中的其他内容一起删除,而是保留在同一个文件夹中。随着时间的推移,这可能会出现问题,因为在应用程序的生命周期中,图像的数量会不断增加。

这就是我到目前为止所尝试的,在图像删除控制器中,我添加了这个fs。Unlinkmethod,但是它不起作用

const token = req.cookies.jwt;
const decoded = jwtAuth.verify(token, process.env.TOKEN_SECRET);
const userId = decoded.id;
const { id } = req.params;
const user = await User.findByPk(userId);
try {
await Post.findOne({
where: { id: id }
}).then((postFind) => {
if (!postFind) return res.status(404).json('Utilisateur non trouvé.');

if (postFind.UserId !== user.id && postFind.UserId !== user.isAdmin === true) return res.status(401).json('Vous ne pouvez pas supprimer cette publication.')
//Si le UserId correspond à celui de la sauce supprimer de la db
const filename = postFind.attachment.split(`/../frontend/public/uploads/post/`)[1];
fs.unlink(`post/${filename}`, () => {
console.log("test", filename);
Post.destroy({ where: { id: postFind.id } })
.then((post) => {
if (post === 0) throw new RequestError("Ce contenu n'existe pas !")
res.status(200).json('Ce contenu a été suppirmé avec succès !')
})
.catch(err => {
next(err)
})
})

删除数据库镜像时,如何从磁盘上删除镜像?基本上,当我删除UI图像时,我希望它也从磁盘中删除。

多中间件配置:

const multer = require("multer");
const MIME_TYPES = {
'image/jpg': 'jpg',
'image/jpeg': 'jpg',
'image/png': 'png',
'image/gif': 'gif'

};
const imageFilter = (req, file, cb) => {
if (file.mimetype.startsWith("image")) {
cb(null, true);
} else {
cb("Veuillez télécharger uniquement des images.", false);
}
};
const storage = multer.diskStorage({
destination: (req, file, cb) => {
let directory = "";
directory = "profil" ? "/profil" : "",
directory = "post" ? "/post" : "";

cb(null, `../frontend/public/uploads/${directory}`);
},
filename: (req, file, cb) => {
let extension = MIME_TYPES[file.mimetype];
let fileName = "";
fileName = "profil" ? "profil" : file.originalname;
fileName = "post" ? "post" + "." + extension : file.originalname + "." + extension;
cb(null, `${Date.now()}_${fileName}`);
},
});
module.exports = multer({ storage: storage, fileFilter: imageFilter });

删除图片的路由:

router.delete (/: id, PostController.deletePost);

路径访问

app.use (' . ./前端/公共/上传/后",express.static (path.join(. ./前端/公众/上传/post ')));

使用path.resolve()创建fs.unlink()可以处理的绝对路径

另外,在请求处理程序中不一致地使用async/await是浪费机会。

const fs = require('fs').promises;
const path = require('path');
async (req, res, next) => {
try {
const { id } = req.params;
const token = jwtAuth.verify(req.cookies.jwt, process.env.TOKEN_SECRET);
const user = await User.findByPk(token.id);
const post = await Post.findOne({ where: { id: id } });
if (!post) return res.status(404).json('Utilisateur non trouvé.');
if (post.UserId !== user.id || !user.isAdmin) return res.status(401).json('Vous ne pouvez pas supprimer cette publication.');
const result = await Post.destroy({ where: { id: post.id } });
if (result === 0) throw new RequestError("Ce contenu n'existe pas !")
const filename = post.attachment.split('/../frontend/public/uploads/post/')[1];
const filepath = path.resolve(`post/${filename}`)
await fs.unlink(filepath);
res.status(200).json('Ce contenu a été suppirmé avec succès !')
} catch (err) {
next(err);
}
}

unlinkSync基本上是nodejs自带的功能

try {
//file removed
var fs = require('fs');
const directoryPath = join(process.cwd(), '/uploads/');
fs.unlinkSync(filePath+body.name);
} catch(err) {
console.error(err)
}

点击这里参考

最新更新