You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:24:00