节点Busboy中止上传

我正在使用busboy ,将我上传的文件写入缓冲区并对其进行validation(宽度,高度和文件大小)。 一旦我发现上传有问题,我不能为了我的生活找出如何中止/停止stream。

例如,如果我想要允许的500kb的最大文件大小,我会跟踪缓冲区的大小,因为它正在上传,如果大小超过500kb,我想中止。

这是我的代码的简化版本。

var self = this; var busboy = new Busboy({ headers: self.req.headers, limits: { files: 1 } }); busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { file.fileRead = []; var size = 0; file.on('data', function(chunk) { size += chunk.length; /* DO VALIDATION HERE */ if( size > 500000) { /*** ABORT HERE ***/ } file.fileRead.push(chunk); }); file.on('end', function() { var data = Buffer.concat(file.fileRead, size); // ... upload to S3 }); self.req.pipe(busboy); }); 

好吧,所以我有同样的问题,我解决了它file.resume();

 var fstream; req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { // Validate file mimetype if(mimetype != 'image/png'){ file.resume(); return res.json({ success: false, message: 'Invalid file format' }); } // Upload fstream = fs.createWriteStream(__dirname + '/tmp/' + timestamp + filename); file.pipe(fstream); fstream.on('close', function () { return res.json({ success: true }); }); }); req.pipe(req.busboy); 

我会尝试这样的事情:

 var self = this; var busboy = new Busboy({ headers: self.req.headers, limits: { files: 1, fileSize: 500000 } }); busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { file.fileRead = []; file.on('limit', function() { //Clear variables }); file.on('data', function(chunk) { file.fileRead.push(chunk); }); file.on('end', function() { var data = Buffer.concat(file.fileRead, size); // ... upload to S3 }); self.req.pipe(busboy); }); 

基本上,我在Busboy的configuration中添加了一个新的限制: fileSize: 500 * 1024

而且我开始收听极限事件:

  file.on('limit', function() { //Clear vars }); 

答案很简单。

 // do the required validation like size check etc. if( size > 500000) { self.req.unpipe(); return; } 

情况是这样的。 我看到在busboy代码中,busboy是作为WritableStream实现的,下面使用Dicer模块进行parsing,也是作为WritableStream实现的。 stream程是这样的:

req stream ==> busboy ==> dicer ==> dicer引发事件==> busboy引发文件事件==>这些事件在您的代码中被使用。

要停止这个代码的整个stream程 – 上面的unipe应该做的。

我认为正确的做法是closures套接字并结束请求

 busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { file.fileRead = []; var size = 0; file.on('data', function(chunk) { size += chunk.length; /* DO VALIDATION HERE */ if( size > 500000) { self.req.socket.end(); self.res.end(); } file.fileRead.push(chunk); }); file.on('end', function() { var data = Buffer.concat(file.fileRead, size); // ... upload to S3 }); self.req.pipe(busboy); }); 

我能够访问底层的Dicerparsing器,它有一个基本上停止上传文件的ignore方法。

以下是我做的: busboy._parser.parser._ignore()

它看起来非常黑客,但它的工作原理和我想要的一样。