使用Express 4.0上传文件:req.files未定义

我试图得到一个简单的file upload机制与Express 4.0的工作,但我一直在app.post正文req.files undefined 。 这是相关的代码:

 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'); }); 

..和随行的Jade代码:

 form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data") input(type="file", name="file", id="file") input(type="submit", value="Upload") 


感谢下面的mscdex的响应,我已经转而使用bodyParser而不是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表单提交,而不是多部分(如果您正在上传文件,将会是这种情况)。

对于多部分,你需要使用像connect-busboy multer或者multer或者connect-multiparty (multiparty /强大的就是最初在expressParser中间件中使用的东西)。 另外FWIW,我正在一个更高层次的公务人员上面改名。 它带有Express中间件,也可以单独使用。

看起来body-parser 确实支持在Express 3中上传文件,但是当Express 4 不再支持Express时,支持被删除了Connect作为依赖项

在查看了mscdex的答案中的一些模块之后,我发现express-busboy是一个更好的select,也是最接近替代品的方式。 我注意到的唯一区别是上传文件的属性。

console.log(req.files)使用body-parser (Express 3)输出一个如下所示的对象:

 { file: { fieldName: 'file', originalFilename: '360px-Cute_Monkey_cropped.jpg', name: '360px-Cute_Monkey_cropped.jpg' path: 'uploads/6323-16v7rc.jpg', type: 'image/jpeg', headers: { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"', 'content-type': 'image/jpeg' }, ws: WriteStream { /* ... */ }, size: 48614 } } 

与使用express- console.log(req.files) (Express 4)的console.log(req.files)相比:

 { file: { field: 'file', filename: '360px-Cute_Monkey_cropped.jpg', file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg', mimetype: 'image/jpeg', encoding: '7bit', truncated: false uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } } 

这里是我发现谷歌search:

 var fileupload = require("express-fileupload"); 

这是非常简单的上传机制

 app.post("/upload", function(req, res) { var file; if(!req.files) { res.send("File was not found"); return; } file = req.files.FormFieldName; // here is the field name of the form file.mv("file.txt", function(err) //Obvious Move function { // log your error }); res.send("File Uploaded"); }); 

express-fileupload看起来像是目前仍然有效的唯一中间件。

在同样的例子中, multerconnect-multiparty给出了一个未定义的req.filereq.files的值,但是express-fileupload起作用。

关于req.file / req.files的空值有很多问题和问题。