NodeJS使用multer上传文件时同名文件自动追加4位随机数重命名实现
实现方案
核心修改点为diskStorage的filename回调逻辑,增加同名文件检测、随机后缀生成逻辑,同时优化路径复用避免重复计算,修改后完整代码如下:
const fs = require('fs'); const multer = require('multer'); const crypto = require('crypto'); // 用crypto生成更随机的4位数字,也可以用Math.random()替代 const maxSize = 10 * 1024 * 1024; // 可按自身需求调整文件大小上限 let storage = multer.diskStorage({ destination: (req, file, cb) => { const date_ob = new Date(); const date = ("0" + date_ob.getDate()).slice(-2); const month = ("0" + (date_ob.getMonth() + 1)).slice(-2); const year = date_ob.getFullYear(); const fullPath = __basedir + "/Files/" + year + "/" + month + "/" + date + "/"; if (!fs.existsSync(fullPath)) { fs.mkdirSync(fullPath, { recursive: true }); } // 把计算好的目标路径挂载到req上,filename回调可直接复用,避免重复计算日期路径 req.uploadDest = fullPath; cb(null, fullPath); }, filename: (req, file, cb) => { // 拆分原文件的主名和后缀 const nameSeg = file.originalname.split('.'); const ext = nameSeg.length > 1 ? `.${nameSeg.pop()}` : ''; const baseName = nameSeg.join('.'); let finalName = file.originalname; // 最多重试3次,避免极端场景下多次生成随机后缀仍然重名的问题 let retryCount = 0; while (retryCount < 3 && fs.existsSync(`${req.uploadDest}${finalName}`)) { // 生成4位随机数字,不足位补前导0 const randomSuffix = String(crypto.randomInt(0, 10000)).padStart(4, '0'); finalName = `${baseName}_${randomSuffix}${ext}`; retryCount++; } cb(null, finalName); }, }); let uploadFile = multer({ storage: storage, limits: { fileSize: maxSize }, }).single("file");
注意事项
- 若不需要高安全性的随机数,可将
crypto.randomInt(0, 10000)替换为Math.floor(Math.random() * 10000),无需引入crypto模块,兼容更低版本的Node.js - 3次重试逻辑可根据自身需求调整,正常场景下4位随机数重复的概率极低,单次生成即可满足需求
- 若项目使用ES模块规范,
__basedir需要自行通过path.dirname(new URL(import.meta.url).pathname)适配生成
内容的提问来源于stack exchange,提问作者D.B.
相关产品推荐
相关产品推荐

