在做项目的过程中,使用了iview的upload上传组件,刚开始图片上传没有问题,但是通过data传参时,nodejs后台怎么也接收不到参数,一直显示“{}”。
然后,通过百度各种查询,也一直未找到合适的解决方案。心情那叫一个沉重啊,我开始思考,为什么一切正常,参数却无法接收。于是,按照程序员解决问题的惯例,打开F12。检查网络请求,看到请求,恍然大悟:
这用的是Form Data!怪自己大意了。我用的是express框架,用require('body-parser'),这个中间件来接收数据,但我的req.body总是为{}。最后我发现body-parser并不支持contentType: multipart/form-data的格式类型,也就是不支持formData格式。于是,我就是用multiparty中间件对formData类型的数据进行处理。结果成功接收到了数据。
下面我把代码贴出来,供大家参考:
前端代码
<template>
<Upload
ref="upload"
:headers="{'Authorization':'Bearer '+token}"
:show-upload-list="false"
:default-file-list="defaultList"
:on-success="handleSuccess"
:format="['jpg', 'jpeg', 'png']"
:max-size="2048"
:on-format-error="handleFormatError"
:on-exceeded-size="handleMaxSize"
:before-upload="handleBeforeUpload"
multiple
type="drag"
:action="uploadUrl"
:data="uploadData"
style="display: inline-block;width:58px;"
>
</template>
<script>
export default {
data() {
return {
uploadData:{userId:JSON.parse(localStorage.getItem("userInfo")).userId},
}
}
}
</script>
后端代码
router.post('/avatar', (req, res) => {
var form = new multiparty.Form();
form.uploadDir = "./public/images";
form.parse(req, function (err, fields, files) {
let userId=fields.userId[0];
if (err) {
throw err;
} else {
//新图片名
//let avatar=userId+'.'+files.file[0].originalFilename.split('.')[1];
let avatar=files.file[0].originalFilename;
//同步重命名文件名
fs.renameSync(files.file[0].path, "./public/images/" + files.file[0].originalFilename);
var sql=`update user set avatar=? where userId=?`;
query(sql,[avatar,userId]).then(result=>{
if (result.affectedRows > 0) {
res.send({
code: 200,
avatar:avatar,
msg: 'updateAvatar success'
});
} else {
res.send({
code: 401,
msg: 'updateAvatar error'
});
}
});
}
})
})
最后打印出来的数据如下图:
以上就是解决这个问题的一些方法,希望对遇到同样问题的朋友,有所帮助。