node gzip将文件解压缩到变量中

时间:2016-05-12 20:39:49

标签: javascript node.js gzip

我使用gzip压缩json字符串,然后将其保存到这样的文件中:

fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => {
    var gzip = zlib.createGzip();
    var inp = fs.createReadStream(`${craneProjectDir}/tree.out`);
    var out = fs.createWriteStream(`${craneProjectDir}/tree`);
    inp.pipe(gzip).pipe(out);
    fs.unlinkSync(`${craneProjectDir}/tree.out`);
});

它似乎有效,因为它创建了文件,但我不确定,因为我无法将其读回变量。这就是我尝试过的:

var treeStream = fs.createReadStream(`${craneProjectDir}/tree`);
zlib.unzip(treeStream, (err, buffer) => {
    if(err){
        connection.console.log((util.inspect(err, false, null)));
    }
    workspaceTree = JSON.parse(buffer.toString());
});

我收到了以下错误:

  

[TypeError:无效的非字符串/缓冲区块]

2 个答案:

答案 0 :(得分:5)

问题可能是您在内容完全写入磁盘之前删除了源文件。

fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => {
    var gzip = zlib.createGzip();
    var inp = fs.createReadStream(`${craneProjectDir}/tree.out`);
    var out = fs.createWriteStream(`${craneProjectDir}/tree`);
    inp.pipe(gzip).pipe(out).on('close', function () {;
      fs.unlinkSync(`${craneProjectDir}/tree.out`);
    });
});

小心绑定而不是结束。 close表示基础文件描述符已关闭,end表示流已完成处理数据。

提取新文件时,你犯了两个错误,

  • 您使用的是zlib.unzip,但内容为 gzipped ,因此您必须使用其中一种gunzip方法。
  • 你使用了zlib.unzip,它需要一个缓冲区但你发送了一个流。

要压缩内容,

  var d = '';
  fs.createReadStream(`${craneProjectDir}/tree`)
  .pipe(zlib.createGunzip())
  .on('data', function (data){
    d += data.toString()
  })
  .on('end', function (){
    console.log(d);
  })

BTW,我怀疑你不需要这个临时文件;)

答案 1 :(得分:0)

我发现我可以使用readFile,并将其内容放入Buffer中,如下所示:

fs.readFile(`${craneProjectDir}/tree`, (err, data) => {
    var treeStream = new Buffer(data);
    zlib.unzip(treeStream, (err, buffer) => {
        if (err) {
            connection.console.log((util.inspect(err, false, null)));
        }
        workspaceTree = JSON.parse(buffer.toString());
        notifyClientOfWorkComplete();
    });
});