Node.js使用Multer上传图片报path参数类型错误问题
报错根因
TypeError [ERR_INVALID_ARG_TYPE] 是Multer内部拼接文件存储全路径时,拿到了undefined类型的文件名参数导致的,代码里存在两处问题:
filename回调里读取req.body.name的逻辑有问题:Multer处理multipart/form-data请求时,会先处理文件流、再解析普通表单字段,执行到生成文件名的逻辑时,req.body还没被填充,req.body.name就是undefineddestination配置的路径/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
相关产品推荐
相关产品推荐

