我使用busboy,将上传的文件写入缓冲区,并对其执行一些验证(宽度、高度和文件大小)。一旦我发现上传有问题,我无论如何也想不出如何中止/停止流。
例如,如果我想要允许的最大文件大小为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);
});发布于 2015-08-26 17:29:26
好的,我也有同样的问题,我用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);发布于 2015-06-04 14:21:22
答案很简单。
// do the required validation like size check etc.
if( size > 500000)
{
self.req.unpipe();
return;
}上下文是这样的。我在服务生代码中看到,服务生被实现为WritableStream,下面使用Dicer模块进行解析,该模块也被实现为WritableStream。流程是这样的:
req stream ==> busboy ==> dicer ==> dicer引发事件==> busboy在文件中引发事件==>这些事件在您的代码中使用。
为了停止这整个代码流-上面的unpipe应该可以做到。
发布于 2015-06-05 11:31:44
我认为正确的做法是关闭套接字并结束请求。
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);
});https://stackoverflow.com/questions/30465882
复制相似问题