1 回答
TA贡献1757条经验 获得超8个赞
首先,解决问题
遇到类似问题,官方文档往往是最好的解答。试下把你的代码改成下面这样,唯一的不同,就是把form的实例化挪动动 upload 里。
// 上传图片
upload: (req, res, next) => {
const form = new formidable.IncomingForm() // 注意,把form 的实例化操作挪进来
//上传文件的保存路径
form.uploadDir = path.dirname('./upload/upload/')
//保存扩展名
form.keepExtensions = true
//上传文件的最大大小
form.maxFieldsSize = 20 * 1024 * 1024
form.parse(req, (err, fields, files) => {
// 项目未打包时使用
const imagepath = 'http://localhost:8088/' + path.normalize(files.file.path)
// 项目打包到server之后使用
// const imagepath = path.normalize(files.file.path)
res.status(200).send(imagepath)
// return next()
})
},
官方文档在 这里,仔细看两眼就会发现你的代码跟它的差别。
其次,探究问题根源
如果好奇问题出在哪里,可以看下 formidable 的源码,incoming_form.js
。
因为你所有的parse
操作都是在同一个form
实例上进行,因此,this.on('end')
会被调用多次。
第一次上传:注册'end'回调,假设回调为 cb1。文件上传成功,cb1调用
第二次上传:新增'end'回调,假设回调为 cb2。由于 this.on() 注册是累加的,当前
end
事件的回调有两个,cb1、cb2。文件上传成功,cb1首先被调用,然后就悲剧了
IncomingForm.prototype.parse = function(req, cb) {
// 忽略一堆无关紧要的代码....
// 注册各种回调,同样忽略掉无关紧要的代码
if (cb) {
this.on('end', function() {
cb(null, fields, files);
});
}
添加回答
举报