首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点Busboy中止上传

节点Busboy中止上传
EN

Stack Overflow用户
提问于 2015-05-27 02:12:42
回答 5查看 4.6K关注 0票数 11

我使用busboy,将上传的文件写入缓冲区,并对其执行一些验证(宽度、高度和文件大小)。一旦我发现上传有问题,我无论如何也想不出如何中止/停止流。

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

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

代码语言:javascript
复制
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);
});
EN

回答 5

Stack Overflow用户

发布于 2015-08-26 17:29:26

好的,我也有同样的问题,我用file.resume();解决了它

代码语言:javascript
复制
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);
票数 6
EN

Stack Overflow用户

发布于 2015-06-04 14:21:22

答案很简单。

代码语言:javascript
复制
// 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应该可以做到。

票数 2
EN

Stack Overflow用户

发布于 2015-06-05 11:31:44

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

代码语言:javascript
复制
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);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30465882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档