2012-09-17 32 views

Trả lời

5

Sử dụng zlib.createGzip/createDeflate để có được một thể hiện của máy nén bạn cần, với các tùy chọn trong một đối tượng.

Nếu bạn muốn làm điều này tất cả trong bộ nhớ:

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

Tất nhiên, nếu bạn đang làm việc với một lượng lớn dữ liệu, dòng đầu ra vào một tập tin chứ không phải là bộ nhớ tạm thời tất cả mọi thứ trong bộ nhớ.

+0

Buffer.concat (bộ đệm) phải đơn giản hơn tuyên bố trường hợp đó. – gluxon

+1

@gluxon: Đúng vậy. Tuy nhiên, 'Buffer.concat' không tồn tại cho đến Node 0.8. Bạn phải làm theo cách này trên các phiên bản cũ hơn. (Ban đầu tôi đã viết mã này trước 0.8) – josh3736

+0

Vâng, tôi đã nhìn lại điều này sau một vài tháng với sự hiểu biết tốt hơn về Node. Tôi phải cảm ơn vì giải pháp này. :) – gluxon

Các vấn đề liên quan