express bodyParser post上传文件request.body 不能获取表单值
问题如上描述:express bodyParser post上传文件request.body 不能获取表单值
可以上传保存文件到指定目录,但是form 里其他表单项却无法用 request.body['表单name'] 来获取表单值.
express 配置如下:
app.use(express.bodyParser({ uploadDir: __dirname + ‘/upload/’, keepExtensions: true, limit: 10000000, defer: true })); app.use(express.multipart()); app.use(express.methodOverride()); form 标示为 enctype=”multipart/form-data” action=”/upload” method=”post” post 路由位置 app.post(‘/upload’, function(req, res) { var user = req.session.user; var company = req.body['company']; var name = req.body['name']; var phone = req.body['phone']; var address = req.body['address'];
上传文件代码
if (req.files && req.files.image) { // 获取文件临时目录 var tmp_path = req.files.image.path;
//指定文件上传后的目录
var target_path = __dirname + '/upload/' + user.channelid; if (req.files.image.size > 10000000) { req.flash('error', '抱歉,确保上传图片小于10M'); return res.redirect('/userinfo'); }
//移动文件
fs.renameSync(tmp_path, target_path, function(err) { if (err) { console.log(err); }; channel.validateimg = target_path; console.log(target_path); channel.Add(function(k, v, err) { if (err) { req.flash('error', '抱歉,更新个人信息失败'); return res.redirect('/userinfo'); } else { req.flash('error', '恭喜,更新个人信息成功'); return res.redirect('/index'); } }) }); }
遇到的问题就是 图片可以保存到 upload 文件夹下,但是上面的 req.body['name'] 等参数值无法获取.
打印出 req.body 也是{} 空对象. 甚至 req.forms 也是{} ,奇怪啊! 如果 forms 为空,那又为什么会成功保存图片到制定目录呢 ? 我们再来仔细看看 express 的配置
app.use(express.bodyParser({ uploadDir: __dirname + '/upload/', keepExtensions: true, limit: 10000000, defer: true })); app.use(express.multipart());
和上传有关的配置就上面几行. express 默认自带中间件 bodyParser 来解析post 类型请求. 当我们上传文件时 post 一个 Multiparty 类型form , 以前有个专门的中间件来处理,名叫 formidable ,但是现在 bodyParser 和 formidable 早已合并,也就是说 bodyParser 完全可以处理 multiparty 类型 post form ,那为什么这里不行呢? 稍后解释!
接着看配置, uploadDir :上传文件保存路径,要绝对路径
keepExtensions:true 保证保存文件时自带扩展名
limit: 10000000 上传文件不超过 10M
defer: true 这个参数的作用是在上传过程中开启各种事件的绑定,比如你要看上传百分比等等….
app.use(express.multipart()); 这是应用中间件 multipart 而此中间件前生正是 formidable .所以既然 bodyParser 集成了 formidable 哪这里是不是重复,所以刚才 req.forms 打印出 {} 可能是bodyParser 截获post 后又交个 multipart 来解析 而导致 req.forms 为空,结果文件成功上传.所以app.use(express.multipart()); 这句配置可以注释掉.
但是 req.body[] 还是不能获取表单参数值,非常奇怪,官方文档说是可以的,无语.我的express 是最新版 3.3
反复测试,把 defer:true 去掉就可以获取表单其他参数,开启 defer 就不行,但是为什么会是这样……不得而知 ⊙﹏⊙b汗
END