Node.js使用Multer多文件上传时文件未生成至目标目录问题
问题排查与解决
核心问题:Multer配置参数名错误
你在创建multer实例时,传入的配置参数是storages,但Multer的正确配置项是storage(单数),这会导致Multer忽略你的自定义磁盘存储配置,转而使用默认的内存存储,所以文件不会写入到指定目录。
修复步骤:
修正Multer实例的配置参数
将控制器中的:const multipleUpload = multer({ storages });修改为:
const multipleUpload = multer({ storage: storages });或者更规范的写法(调整变量名避免混淆):
// 先把diskStorage的变量名改为storage const storage = multer.diskStorage({...}); const multipleUpload = multer({ storage });解决变量名冲突问题
你在控制器末尾导出的storages: multipleUpload,和之前定义的diskStorage变量storages重名,会覆盖原有变量。建议修改导出键名:// 控制器末尾 uploadMiddleware: multipleUpload,路由中同步修改导入:
const { uploadMiddleware } = adminController router.post("/add-product" , uploadMiddleware.array("uploads" , 4), adminController.adminAddproduct_post)确保目标目录存在
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) }, // ...其他配置 });统一文件名存储逻辑
你在productImage中生成的文件名,会和diskStorage里的文件名时间戳不一致(两次Date.now()调用有时间差),建议直接使用Multer处理后的文件名:productImage: req.files.map(file => file.filename),
验证修复
修改后重启服务,上传文件时控制台会打印gettin the filename和文件信息,文件将正常出现在./public/product目录,数据库也会存储正确的文件名。
内容的提问来源于stack exchange,提问作者user18243088
相关产品推荐
相关产品推荐

