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

How to unzip a .gz string in node.js

我正在从远程服务器下载一个 .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),但是我得到了一个错误

incorrect header check at Gunzip.zlibOnError (zlib.js:152:15)

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

我使用以下方法创建文件:zlib.createGzip(); 然后 gzip.pipe(writeStream);


更新

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

更新: 我修改了代码,现在你有一个实际解压的 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 文件。

问题是 fs.createWriteStream 默认为 utf-8 编码,您应该将其更改为 binary,然后您将能够创建一个有效的缓冲区 gunzip 会欣然接受。

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

来完成此操作
gzip.pipe(data => writeStream(data, { encoding: 'binary'})

see https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options