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ớ.
Buffer.concat (bộ đệm) phải đơn giản hơn tuyên bố trường hợp đó. – gluxon
@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
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