【问题标题】:How to unzip a .gz string in node.js如何在 node.js 中解压缩 .gz 字符串
【发布时间】:2018-02-07 18:11:47
【问题描述】:

我正在从远程服务器下载.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 编码的,因此我需要确保它保持为缓冲区或二进制文件。

【问题讨论】:

  • 当您提到您将 .csv.gz 存储为字符串时。你是怎么编码的?
  • writeStream 是如何定义的?
  • @Eelke 我只是将它传送到一个普通的fs.createWriteStream,这会产生这个.csv.gz 文件。

标签: javascript node.js gzip zlib


【解决方案1】:

问题是fs.createWriteStream默认为utf-8编码,你应该把它改成binary,然后你就可以创建一个gunzip乐意接受的有效缓冲区。

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

gzip.pipe(data => writeStream(data, { encoding: 'binary'})

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

【讨论】:

  • 谢谢。我尝试将其更改为binary,但随后我无法在我的 Macbook 上本地下载和解压缩文件。
  • 您的示例中的body 来自哪里?那可能是一个 utf-8 编码的字符串,如果您可以设法将编码更改为二进制(当缓冲区更改为字符串时),您应该会很好
  • 你是对的!那是罪魁祸首 - 希望这会奏效
【解决方案2】:

更新: 我已经修改了代码,这样现在您就有了一个实际解压缩的 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 文件。

【讨论】:

  • 谢谢,但我认为我的情况有所不同,因为我已经将内容存储为字符串(不是缓冲区),并且没有要读取的文件。如何使用您的方法来应用它?
  • @d-_-b 。我已经更新了我的答案。我无法使用任何示例 http csv。所以我只是在读取文件时创建 ArrayBuffer。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多