【问题标题】:Node Busboy abort upload节点 Busboy 中止上传
【发布时间】:2015-08-08 13:26:46
【问题描述】:

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

【问题讨论】:

  • 您可以将文件大小限制为busyboy的参数-它只是fileSize属性...
  • 如果我想验证文件的宽度和高度怎么办?然后我需要中止流,而不是指望limit 事件。
  • 我在我接受的赏金中有一篇关于这个somewhere的帖子,但它没有使用busbuy。
  • @BenjaminGruenbaum 如果你把它挖出来,我很想看看。发布答案,如果这是我需要的,我会接受。
  • 它对标题进行检查,但可以很容易地应用到你想要它做任何事情stackoverflow.com/a/16349882/1348195

标签: javascript node.js express busboy


【解决方案1】:

我会尝试这样的:

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
    });

【讨论】:

【解决方案2】:

答案很简单。

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

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

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

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

【讨论】:

    【解决方案3】:

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

    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);
    });
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 以下划线开头的函数通常表示不应从库外部访问的私有方法。我强烈建议不要这样做。
      【解决方案5】:

      好的,我遇到了同样的问题,我用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);
      

      【讨论】:

      • 这不会中止上传,它只是等待所有数据都用完。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多