Node.js Multer:如何使文件名与数据库中保存的文件名相同
现在我基本上可以Node.js Multer:如何使文件名与数据库中保存的文件名相同,node.js,mongodb,multer,Node.js,Mongodb,Multer,现在我基本上可以保存图像文件的名称或原始名称,这两种格式都可以:- 数据库(使用猫鼬)和 图像文件夹 但这种方法在尝试删除图像时会有缺陷。例如,如果我尝试两次上传相同的图像Multer将不会在目的地位置或文件夹(/upload)中再次复制新图像(同一图像)。因此,如果稍后,我尝试从:-中删除一个数据(请记住,现在我有两个数据,它们具有相同的图像名称) 数据库(使用mongoose) 从文件夹/upload 使用相同图像的其他数据将不再有图像 因此,我尝试将newdate().toISOStrin
保存图像文件的名称或原始名称,这两种格式都可以:-
数据库(使用猫鼬)和
图像文件夹
但这种方法在尝试删除图像
时会有缺陷。例如,如果我尝试两次上传相同的图像Multer
将不会在目的地位置或文件夹(/upload
)中再次复制新图像(同一图像)。因此,如果稍后,我尝试从:-中删除一个数据(请记住,现在我有两个数据,它们具有相同的图像名称)
数据库(使用mongoose
)
从文件夹/upload
使用相同图像的其他数据
将不再有图像
因此,我尝试将newdate().toISOString().replace(/[-T:\.Z]/g,”)
放在filename
中保存在local文件夹/upload
和mongoDb
中的文档中。但显然,这不起作用,因为生成的日期对于这两种情况都略有不同
以下是我目前的代码:-
- Multer.js
//Mutler
常量multer=require('multer')
//路径
const path=require('路径')
//文件删除
const fileRemove=require('fs')
常数{
//文件基文件夹位置
FILE_BASE_FOLDER_LOCATION=path.resolve(uu dirname+'/','../'),
//图像文件夹位置
IMAGE_FOLDER_LOCATION=FILE_BASE_FOLDER_LOCATION+'/upload/',
}=process.env
//存储img
const storageImgFile=multer.diskStorage({
目的地:(请求、文件、cb)=>{
cb(空,图像\文件夹\位置)
},
文件名:(请求、文件、cb)=>{
//重命名图像文件,使其具有“日期”和原始文件名
cb(null,new Date().toISOString().replace(/[-T:\.Z]/g,”)+'-'+file.originalname)
}
})
//滤波器img类型
常量filterImgFile=(请求、文件、cb)=>{
const fileTypes=['image/png','image/jpg','image/jpeg']
if(fileTypes.includes(file.mimetype))cb(null,true)
else cb('只允许.png.jpg和.jpeg格式!',false)
}
//Img文件上传中间件
const uploadImgFile=multer({
存储:storageImgFile,
filterImgFile:filterImgFile
//限制:{fieldSize:1000000000}
})
//Img移除处理器
常量handleImgRemove=(res,imgName)=>{
fileRemove.unlink(图像\u文件夹\u位置+imgName,(错误)=>{
如果(错误){
返回res.status(500).json({
成功:错,
错误:`从上载文件夹删除文件失败',
数据:错误
})
}
})
}
module.exports={
imgFolderLocation:图像\文件夹\位置,
上传imgfile,
handleImgRemove,
}
AddNewImage路由
:-
router.post('/add',uploadImgFile.single('file'),async(req,res)=>{
设{desc}=req.body
常量图像=新图像({
//日期将与保存在“本地”目标中的“imagename”略有不同或不相同
imgName:new Date().toISOString().replace(/[-T:\.Z]/g,”)+'-'+req.file.originalname,
描述:描述
});
image.save()
。然后(res=>{
返回res.status(200).json({
成功:没错,
计数:res.length,
数据:res
})
})
.catch(错误=>{
console.log(错误)
返回res.status(500).json({
成功:错,
错误:`未能上载新图像!`,
数据:错误
})
})
})
删除图像路由
:-
router.delete('/delete/:id',异步(req,res)=>{
等待Image.findByIdAndDelete(请求参数id)
。然后(数据=>{
//-从上载文件夹中删除图像
handleImgRemove(res,data.imgName)
返回res.status(200).json({
成功:没错,
计数:data.length,
数据:数据
})
})
.catch(错误=>{
返回res.status(500).json({
成功:错,
错误:`未能从数据库中删除映像!`,
数据:错误
})
})
})
我希望(imgName
保存在mongoDb
中)和filename
保存在local
目标文件夹/upload
中都是一样的。但我不能。那么,我如何才能确保它们都有相同的命名系统或方式呢
const multer = require("multer");
const uuid = require("uuid").v4;
const path = require("path");
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads");
},
filename: (req, file, cb) => {
const ext = path.extname(file.originalname);
const originalname = `${uuid()}${ext}`;
cb(null, originalname);
},
});
const upload = multer({ storage });
npm安装uuid
您需要使用uuid为每个图像指定一个唯一的名称,您可以通过为每个图像指定一个文件名来实现这一点,如示例中所示。这也将解决同一文件不会存储两次的问题。您还可以将当前日期添加到文件名中,以进一步减少两个文件同名的可能性
这就是图像对象的外观
{
fieldname: 'file',
originalname: 'image1.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'uploads',
filename: '31d41f39-b4ad-467c-bb09-601596240fe8.jpg',
path: 'uploads\\31d41f39-b4ad-467c-bb09-601596240fe8.jpg',
size: 961388
}