• 首页
  • javascript
  • express bodyParser post上传文件request.body 不能获取表单值

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


回到顶部