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

Node.js使用Multer上传图片报path参数类型错误问题

报错根因

TypeError [ERR_INVALID_ARG_TYPE] 是Multer内部拼接文件存储全路径时,拿到了undefined类型的文件名参数导致的,代码里存在两处问题:

  • filename回调里读取req.body.name的逻辑有问题:Multer处理multipart/form-data请求时,会先处理文件流、再解析普通表单字段,执行到生成文件名的逻辑时,req.body还没被填充,req.body.name就是undefined
  • destination配置的路径/public/images是操作系统根目录下的路径,不是项目里的静态资源目录,就算文件名正常,文件也会存到错误位置,和前面配置的静态资源访问路径不匹配。
修复代码

直接调整Multer的storage配置即可:

app.use("/images", express.static(path.join(__dirname, "/public/images")));

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    // 拼接项目内的绝对路径,和静态资源配置的目录完全一致
    cb(null, path.join(__dirname, "/public/images"));
  },
  filename: (req, file, cb) => {
    // 不要依赖req.body传文件名,用时间戳+原始文件名生成唯一名称,保证值为字符串
    const uniqueName = `${Date.now()}-${file.originalname}`;
    cb(null, uniqueName);
  },
});

const upload = multer({ storage: storage });
app.post("/api/upload", upload.single("file"), (req, res) => {
  try {
    return res.status(200).json("File uploaded successfully");
  } catch (error) {
    console.error(error);
    res.status(500).json(error);
  }
});
额外注意

如果一定要从前端传自定义文件名,前端构造FormData时,必须先append自定义的name字段,再append文件字段,否则还是会出现字段读取不到的问题,这种方式兼容性差,不推荐使用。同时要保证前端append文件时用的字段名是file,和后端upload.single("file")的参数完全匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:48:16