Node处理文件上传的问题
发布于 9 年前 作者 suemi994 7461 次浏览 最后一次编辑是 8 年前 来自 问答

我使用的是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 已经解决了

回到顶部