如何在node.js中解压缩.gz字符串

时间:2018-02-07 18:11:47

标签: javascript node.js gzip zlib

我正在从远程服务器下载.csv.gz文件,并且我将此文件的内容存储为字符串。以下是我在console.log时看到的一小部分示例:

�}�v������)��t�Y�j�8p0�eCR��

l��1�=���6������~̵r�����0c7�7L���������U:���0�����g��

如何在Node.js中解压缩,以便将其转换为原始的.csv文件?

我已经尝试了zlib.gunzip(Buffer.new(body), callback),但后来又出现了错误

  在Gunzip.zlibOnError(zlib.js:152:15)

错误的标题检查

文件本身有效,我可以双击解压缩并在我的电脑上打开它。

我使用:zlib.createGzip();然后gzip.pipe(writeStream);

创建文件

更新

(实际)问题是我的数据是utf8编码所以我需要确保它仍然是缓冲区或二进制文件。

2 个答案:

答案 0 :(得分:2)

问题是fs.createWriteStream默认为utf-8编码,您应该将其更改为binary,然后您就可以创建gunzip将有效的缓冲区高兴地接受。

您可以通过将代码更改为:

来实现此目的
gzip.pipe(data => writeStream(data, { encoding: 'binary'})
  

请参阅https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options

答案 1 :(得分:0)

更新: 我修改了代码,现在你有了一个实际解压缩的ArrayBuffer。

  function decompressFile(filename) {
       var decompress = zlib.createUnzip(),
        input = fs.createReadStream(filename);      
        var data = [];
        input.on('data', function(chunk){
            data.push(chunk);               
        }).on('end', function(){
            var buf = Buffer.concat(data);
            zlib.gunzip(buf, function(err, buffer) {
              if (!err) {
                console.log(buffer.toString()+'\n');
              }else{
                console.log(err);
              }
            });
        });
}
decompressFile('TestFileSheet1.csv.gz');

这看起来很直接。但我认为问题可能在您的代码中的其他位置或您正在使用的http库中。检查响应头的内容编码是否为gzip,然后调用zlib.gunzip。我认为您的http库可能已经解压缩了csv文件。