我试图让一个简单的文件上传机制与 Express 4.0 一起工作,但我一直undefined在req.files努力app.post。以下是相关代码:
undefined
req.files
app.post
var bodyParser = require('body-parser'); var methodOverride = require('method-override'); //... app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true })); app.use(methodOverride()); //... app.post('/fileupload', function (req, res) { console.log(req.files); res.send('ok'); });
.. 以及随附的 Pug 代码:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data") input(type="file", name="file", id="file") input(type="submit", value="Upload")
解决方案 我已切换到使用busboy而不是bodyParser:
busboy
bodyParser
var fs = require('fs'); var busboy = require('connect-busboy'); //... app.use(busboy()); //... app.post('/fileupload', function(req, res) { var fstream; req.pipe(req.busboy); req.busboy.on('file', function (fieldname, file, filename) { console.log("Uploading: " + filename); fstream = fs.createWriteStream(__dirname + '/files/' + filename); file.pipe(fstream); fstream.on('close', function () { res.redirect('back'); }); }); });
该body-parser模块仅处理 JSON 和 urlencoded 表单提交,而不是多部分(如果您正在上传文件,则会出现这种情况)。
body-parser
对于多部分,您需要使用类似connect-busboy或multer或connect- multiparty(多方/强大是 express bodyParser 中间件中最初使用的)。同样FWIW,我正在busboy之上开发一个更高级别的层,称为reformed. 它带有一个 Express 中间件,也可以单独使用。
connect-busboy
multer
connect- multiparty
reformed