使用Multer在Node.js中上传文件时req.file返回undefined的问题
Mac系统下Multer无法上传文件(req.file为undefined)的解决方案
问题:在Mac系统中使用Node.js的multer包无法上传任何文件或图片,但相同代码在Windows系统可正常运行。用Postman调用API后,控制台打印的
req.file为undefined。相关代码如下:
const express = require('express'); const app = express(); const multer = require('multer'); const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads') }, filename: function (req, file, cb) { console.log(file) // const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) cb(null, file.originalname) } }) const upload = multer({storage: storage}) app.post('/post', upload.single('avatar'), (req,res)=>{ console.log(req.file) if (!req.file) { return res.status(400).send([{ msg: "File is missing",err }]) } else{ return res.status(200).send([{ msg: "working", }]) } }); app.listen(3000,(err,succes)=>{ if (err) { console.log(err) }else{ console.log("Server is running in port number",3000) } });
解决方法
检查uploads目录权限与存在性
Mac系统对文件权限管控更严格,先确认项目根目录下的uploads目录存在,且Node进程有读写权限:- 终端执行创建目录:
mkdir uploads - 赋予基础权限:
chmod 755 uploads(生产环境不建议用777权限)
- 终端执行创建目录:
验证Postman请求格式
确保Postman的POST请求使用form-data格式,且文件对应的键名是avatar(需与代码中upload.single('avatar')的参数完全一致),不要使用raw、binary等其他格式。修复代码中的语法错误
原代码返回400响应时引用了未定义的err变量,会导致服务器报错中断请求,修改为:return res.status(400).send([{ msg: "File is missing" }])重新安装multer确保版本兼容
不同系统下依赖包可能存在版本差异,重新安装multer:npm uninstall multer npm install multer改用绝对路径指定上传目录
相对路径在不同系统的解析逻辑可能不同,用绝对路径避免路径解析错误:const path = require('path'); const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, path.join(__dirname, 'uploads')) }, filename: function (req, file, cb) { console.log(file) cb(null, file.originalname) } })
内容的提问来源于stack exchange,提问作者keerthiseelan
相关产品推荐
相关产品推荐

