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
      }