我们正在与一个使用Keystonejs 0.3.16的客户端合作,提供将文件上传到服务器文件系统的可能性(不是来自keystone admin ui)。第一手,这似乎微不足道,我预计这将在不到一个小时的时间内完成。在完成这项工作直到午夜之后,由于我的睡眠会更好,因此我必须暂时辞职,事实上,我的梦想因此而不稳定。多么极客你必须思考,过一个生命!然而,我相信很多人都会知道这种感觉。 我现在转向你们,社区和keystonejs的作者,帮助我理解我在这里缺少的东西。
我使用的是最新版本的基石,我尝试了多个库来处理多部分格式文件上传作为中间件组件。 Multer,强大,jfum,jquery-file-upload-middleware,connect-busboy,connect-multiparty ......我做了所有这些。一个甚至没有安装由于一些编译错误由于库不兼容,有些给了我500个错误告诉我req.status没有定义,所有其他人告诉我上传很顺利,但req.body和req.file保持不变空了,没有下载。
我甚至添加了一些日志记录到multer lib“makeMiddleware”,看看文件是否被解析,但是busboy.on(' file',...)事件永远不会被触发,表明没有文件存在在体内。
我还没有在基本的Nodejs Express服务器应用程序中尝试这个,只在keystone js应用程序上,所以也许keystone预处理发布请求以某种方式可以解释这种现象,例如。在文件内容到达我的中间件之前将其剥离?
这是我的基本形式:
<form method="post" role="form" enctype="multipart/form-data" action="/bo/lib/upload">
<input type="file" id="imageFileId" name=" imageFileName">
<input type="submit" value="Upload Image">
<form>
这里以我的例子使用Multer为例:
var upload = multer({ dest: './uploads/'});
exports = module.exports = function(app) {
app.post('/', upload.single('myimage'), function(req, res){
console.log(req.body) // returns empty ???
console.log(req.file) // returns empty ???
res.status(204).end()
}]);
};
如果有人,也许是keystonejs开发方的人,可以帮助我理解这一点,甚至更好地解决这个问题,我会非常感谢你的帮助,并确保今晚睡得更好; - )
答案 0 :(得分:1)
遇到同样的问题。 Keystone正在使用bodyParser解析req
,然后才能到达./routes/index.js,在那里你有multer(或者我的情况下是busboy)试图解析请求。在./routes/index.js中停用app.use(bodyParser.json())
和app.use(bodyParser.urlencoded())
无法解决问题。
如果您填充了console.log(req.body)
这个事实就证实了这一点,但添加了一个在multer或busboy上调用console.log("Multer of busboy just parsed a file or field")
的事件监听器将永远不会输出字段或文件。