【问题标题】:How to use Node.js zlib module with options?如何使用带有选项的 Node.js zlib 模块?
【发布时间】:2012-09-17 21:48:16
【问题描述】:

我需要使用 zlib 在极端压缩级别压缩 Node.js 中的缓冲区。输出的标头应该是 78 DA。除非我遗漏了什么,否则 Node.js 文档并没有真正描述如何使用 zlib.Deflate 类。它不接受任何参数。

http://nodejs.org/api/zlib.html#zlib_class_zlib_deflate

【问题讨论】:

    标签: node.js zlib


    【解决方案1】:

    使用zlib. createGzip/createDeflate 获取您需要的压缩器实例,并在对象中提供选项。

    如果你想在内存中做这一切:

    var zlib = require('zlib');
    
    // create a new gzip object
    var gzip = zlib.createGzip({
        level: 9 // maximum compression
    }), buffers=[], nread=0;
    
    // attach event handlers...
    
    gzip.on('error', function(err) {
        gzip.removeAllListeners();
        gzip=null;
    });
    
    gzip.on('data', function(chunk) {
        buffers.push(chunk);
        nread += chunk.length;
    });
    
    
    gzip.on('end', function() {
        var buffer;
        switch (buffers.length) {
            case 0: // no data.  return empty buffer
                buffer = new Buffer(0);
                break;
            case 1: // only one chunk of data.  return it.
                buffer = buffers[0];
                break;
            default: // concatenate the chunks of data into a single buffer.
                buffer = new Buffer(nread);
                var n = 0;
                buffers.forEach(function(b) {
                    var l = b.length;
                    b.copy(buffer, n, 0, l);
                    n += l;
                });
                break;
        }
    
        gzip.removeAllListeners();
        gzip=null;
    
        // do something with `buffer` here!
    });
    
    // and finally, give it data to compress
    gzip.write(inputBuffer);
    gzip.end();
    

    当然,如果您要处理大量数据,请将输出流式传输到文件中,而不是在内存中缓冲所有内容。

    【讨论】:

    • Buffer.concat(buffers) 应该比 case 语句更简单。
    • @gluxon:没错。然而,Buffer.concat 直到 Node 0.8 才存在。您必须在旧版本上这样做。 (我最初是在 0.8 之前写的这段代码)
    • 是的,几个月后我对 Node.js 有了更深入的了解。我必须感谢您提供此解决方案。 :)
    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2014-01-10
    • 2019-02-03
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多