我正在尝试使用一个简单的文件上传机制与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');
});
..以及随附的Pug代码:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")
Solution
感谢下面mscdex的回复,我已切换到使用 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');
});
});
});
8 回答
这是我发现谷歌搜索:
这是非常简单的上传机制
看起来
body-parser
支持在Express 3中上传文件,但是对于Express 4的支持被删除no longer included Connect as a dependency在查看了mscdex的答案中的一些模块之后,我发现express-busboy是一个更好的替代方案,也是最接近替代品的东西 . 我注意到的唯一区别在于上传文件的属性 .
console.log(req.files)
使用 body-parser (Express 3)输出一个如下所示的对象:与使用 express-busboy (Express 4)的
console.log(req.files)
相比:body-parser模块仅处理JSON和urlencoded表单提交,而不是多部分(如果您正在上传文件,则会出现这种情况) .
对于multipart,你需要使用像connect-busboy或multer或connect-multiparty这样的东西(multiparty / formidable是最初在express bodyParser中间件中使用的) . 还有FWIW,我正在编写一个名为reformed的busboy之上的更高层 . 它配有Express中间件,也可以单独使用 .
multer是一个处理“multipart / form-data”的中间件,并且神奇地将上传的文件和表单数据作为request.files和request.body提供给我们 .
安装过滤器: -
npm install multer --save
在.html文件中: -
在.js文件中: -
希望这可以帮助!
1)确保您的文件确实是从客户端发送的 . 例如,您可以在Chrome控制台中查看它:screenshot
2)这是NodeJS后端的基本示例:
PROBLEM SOLVED !!!!!!!
原来
storage
函数DID NOT运行一次 . 因为我必须将app.use(upload)
包括为upload = multer({storage}).single('file');
请使用以下代码
express-fileupload
看起来是目前仍然有效的唯一中间件 .使用相同的示例,
multer
和connect-multiparty
给出了req.file或req.files的未定义值,但express-fileupload
有效 .关于req.file / req.files的空值,提出了很多问题和问题 .