Node处理文件上传的问题
我使用的是busboy插件来处理文件上传,大致机理如下: 插件注册了一个file事件的处理程序,file事件是当文件上传完时会触发的事件。 可是当我只发出上传请求,而文件实际是undefined的时候,就一直不会触发事件,很长时间后处理才会结束。 如果连续5次发出这样的请求,Node进程就会卡住,需要几分钟才恢复过来。 后端怎样才能在这种情况下流畅运行? 不要说别发送undefined,万一别人就是这样攻击你的服务器呢? 所以我要区别出这种情况并做相应措施。 下面贴代码 req.pipe(req.busboy); console.log(req.busboy); req.busboy.on(‘file’,cont); cont是对应处理的函数
7 回复
呃。。你要不要试着把 pipe 放在事件注册之后? 我想不出为什么连续发出请求会卡住,node 是不怕慢客户端攻击的
在pipe之前,你需要检查request的HEADER,
- 看看content-type是不是multipart/form-data;
- 有没有设置boundary
- 有咩有content-length
基于官方的例子:
var http = require('http'),
path = require('path'),
fs = require('fs'),
os = require('os');
var Busboy = require('busboy');
http.createServer(function(req, res) {
if (req.method === 'POST') {
//在这里做一个头部数据检查
if(!/multipart\/form-data/i.test(req.headers['content-type'])){
return res.end('wrong');
}
var busboy = new Busboy({ headers: req.headers });
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
console.log('file')
var saveTo = path.join(os.tmpDir(), path.basename(fieldname));
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('finish', function() {
res.writeHead(200, { 'Connection': 'close' });
res.end("That's all folks!");
});
return req.pipe(busboy);
}
res.writeHead(404);
res.end();
}).listen(8000, function() {
console.log('Listening for requests');
});
@alsotang 应该不是这样子的,如果我确实上传文件了,连续多少次基本不会卡
@eeandrew 我确实没有检查header,受教了。
@suemi994 请问您的问题解决了么?
@CocaCola183 已经解决了