12

我正在使用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);
});
4

5 回答 5

6

好的,所以我遇到了同样的问题,我解决了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-08-26T09:29:26.457 回答
2

答案很简单。

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

上下文是这样的。我在 busboy 代码中看到 busboy 被实现为 WritableStream 并且在下面使用Dicer模块进行解析,该模块也被实现为 WritableStream。流程是这样的:

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

要停止整个代码流 - 上面的 unpipe 应该做。

于 2015-06-04T06:21:22.037 回答
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) {

            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);
});
于 2015-06-05T03:31:43.963 回答
0

我会尝试这样的事情:

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 的配置中添加了一个新的限制:fileSize: 500 * 1024

我开始收听限制事件:

    file.on('limit', function() {
        //Clear vars
    });
于 2015-05-29T19:43:59.907 回答
-1

我能够访问底层Dicer解析器,该解析器具有ignore基本上停止上传文件的方法。

我是这样做的:busboy._parser.parser._ignore()

它看起来确实很hackish,但它确实有效并且完全符合我的要求。

于 2015-06-10T14:14:53.957 回答