web-dev-qa-db-fra.com

Compression et décompression de données à l'aide de zlib dans Nodejs

Quelqu'un peut-il m'expliquer s'il vous plaît comment fonctionne la bibliothèque zlib dans Nodejs?

Je suis assez nouveau sur Nodejs et je ne sais pas encore comment utiliser les tampons et les flux.

Mon scénario simple est une variable de chaîne et je souhaite compresser ou décompresser (dégonfler ou gonfler, gzip ou gunzip, etc.) la chaîne en une autre.

C'est à dire. (comment je m'attendrais à ce qu'il fonctionne)

var zlib = require('zlib');
var str = "this is a test string to be zipped";
var Zip = zlib.Deflate(str); // Zip = [object Object]
var packed = Zip.toString([encoding?]); // packed = "packedstringdata"
var unzipped = zlib.Inflate(packed); // unzipped = [object Object]
var newstr = unzipped.toString([again - encoding?]); // newstr = "this is a test string to be zipped";

Merci pour l'aide :)

25
Eli

Update: ne s'est pas rendu compte qu'il y avait un nouveau module 'zlib' intégré dans le noeud 0.5. Ma réponse ci-dessous concerne le module tiers node-zlib . Mettra à jour la réponse pour la version intégrée momentanément.

Update 2: Il semble y avoir un problème avec le 'zlib' intégré. L'exemple de code dans la documentation ne fonctionne pas pour moi. Le fichier résultant n'est pas gunzip'able (échec avec "fin inattendue du fichier" pour moi). En outre, l'API de ce module n'est pas particulièrement adaptée à ce que vous essayez de faire. C'est plus pour travailler avec des flux plutôt que des tampons, alors que le module node-zlib a une API plus simple et plus facile à utiliser pour les tampons.


Un exemple de dégonflage et de gonflage à l’aide d’un module tiers node-zlib:

$ node

> // Load zlib and create a buffer to compress
> var zlib = require('zlib');
> var input = new Buffer('lorem ipsum dolor sit amet', 'utf8')

> // What's 'input'?
> input
<Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74>

> // Compress it
> zlib.deflate(input)
<SlowBuffer 78 9c cb c9 2f 4a cd 55 c8 2c 28 2e cd 55 48 c9 cf c9 2f 52 28 ce 2c 51 48 cc 4d 2d 01 00 87 15 09 e5>

> // Compress it and convert to utf8 string, just for the heck of it
> zlib.deflate(input).toString('utf8')
'x???/J?U?,(.?UH???/R(?,QH?M-\u0001\u0000?\u0015\t?'

> // Compress, then uncompress (get back what we started with)
> zlib.inflate(zlib.deflate(input))
<SlowBuffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74>

> // Again, and convert back to our initial string
> zlib.inflate(zlib.deflate(input)).toString('utf8')
'lorem ipsum dolor sit amet'
21
broofa

Pour tous ceux qui tombent sur cette question en 2016 (et se demandent également comment sérialiser des données compressées en chaîne plutôt qu'en fichier ou en mémoire tampon), il semble que zlib (depuis le noeud 0.11) fournit désormais des versions synchrones de ses fonctions ne nécessitant pas de rappel:

var zlib = require('zlib');
var input = "Hellow world";

var deflated = zlib.deflateSync(input).toString('base64');
var inflated = zlib.inflateSync(new Buffer(deflated, 'base64')).toString();

console.log(inflated);
39
Maksym

la réponse de Broofa est excellente, et c’est exactement ainsi que je aimerais travailler. Pour moi, le noeud a insisté sur les rappels. Cela a fini par ressembler à:

var zlib = require('zlib');
var input = new Buffer('lorem ipsum dolor sit amet', 'utf8')


zlib.deflate(input, function(err, buf) {
    console.log("in the deflate callback:", buf);

    zlib.inflate(buf, function(err, buf) {
            console.log("in the inflate callback:", buf);
            console.log("to string:", buf.toString("utf8") );
    });

});

qui donne:

in the deflate callback: <Buffer 78 9c cb c9 2f 4a cd 55 c8 2c 28 2e cd 55 48 c9 cf c9 2f 52 28 ce 2c 51 48 cc 4d 2d 01 00 87 15 09 e5>
in the inflate callback: <Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74>
to string: lorem ipsum dolor sit amet
0
Ben