使用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
看起来像是目前仍然有效的唯一中间件。
在同样的例子中, multer
和connect-multiparty
给出了一个未定义的req.file或req.files的值,但是express-fileupload
起作用。
关于req.file / req.files的空值有很多问题和问题。