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

Node.js使用Multer多文件上传时文件未生成至目标目录问题

问题排查与解决

核心问题:Multer配置参数名错误

你在创建multer实例时,传入的配置参数是storages,但Multer的正确配置项是storage(单数),这会导致Multer忽略你的自定义磁盘存储配置,转而使用默认的内存存储,所以文件不会写入到指定目录。

修复步骤:

  1. 修正Multer实例的配置参数
    将控制器中的:

    const multipleUpload = multer({ storages });
    

    修改为:

    const multipleUpload = multer({ storage: storages });
    

    或者更规范的写法(调整变量名避免混淆):

    // 先把diskStorage的变量名改为storage
    const storage = multer.diskStorage({...});
    const multipleUpload = multer({ storage });
    
  2. 解决变量名冲突问题
    你在控制器末尾导出的storages: multipleUpload,和之前定义的diskStorage变量storages重名,会覆盖原有变量。建议修改导出键名:

    // 控制器末尾
    uploadMiddleware: multipleUpload,
    

    路由中同步修改导入:

    const { uploadMiddleware } = adminController
    router.post("/add-product" , uploadMiddleware.array("uploads" , 4), adminController.adminAddproduct_post)
    
  3. 确保目标目录存在
    Multer不会自动创建./public/product目录,若目录不存在,文件写入会静默失败。可以手动创建目录,或在代码中添加目录检测逻辑:

    const fs = require('fs');
    const path = require('path');
    
    const destinationPath = path.join(__dirname, '../public/product');
    // 递归创建目录(不存在则创建)
    if (!fs.existsSync(destinationPath)) {
      fs.mkdirSync(destinationPath, { recursive: true });
    }
    
    const storages = multer.diskStorage({
      destination: (req, file, cb) => {
        cb(null, destinationPath);
        console.log(file)
      },
      // ...其他配置
    });
    
  4. 统一文件名存储逻辑
    你在productImage中生成的文件名,会和diskStorage里的文件名时间戳不一致(两次Date.now()调用有时间差),建议直接使用Multer处理后的文件名:

    productImage: req.files.map(file => file.filename),
    

验证修复

修改后重启服务,上传文件时控制台会打印gettin the filename和文件信息,文件将正常出现在./public/product目录,数据库也会存储正确的文件名。

内容的提问来源于stack exchange,提问作者user18243088

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:05:31