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

3

我正在从远程服务器下载一个.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编码,因此我需要确保它仍然作为缓冲区或二进制数据。

2
当你提到将 .csv.gz 存储为字符串时,你是如何进行编码的? - karthick
writeStream 是如何定义的? - Eelke
@Eelke,我只是将它导向普通的 fs.createWriteStream,结果就是生成了这个 .csv.gz 文件。 - d-_-b
2个回答

4
问题在于fs.createWriteStream默认使用utf-8编码,你需要将其改为binary,这样你就可以创建一个有效的缓冲区,gunzip会很高兴地接受它。
你可以通过更改代码来完成此操作:
gzip.pipe(data => writeStream(data, { encoding: 'binary'})

请查看https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options

谢谢。我尝试将其更改为“二进制”,但是在我的MacBook上无法本地下载和解压缩文件。 - d-_-b
1
在你的例子中,body 是从哪里来的?那很可能是一个 utf-8 编码的字符串,如果你能够将编码更改为二进制(当缓冲区变成字符串时),那么你应该就可以了。 - Eelke
你说得对!那就是罪魁祸首 - 希望这样能行。 - d-_-b

1

更新: 我已经修改了代码,现在你可以获得一个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
@d-_-b。我已经更新了我的答案。我无法使用任何示例http csv。所以当读取文件时,我只是创建ArrayBuffer。 - karthick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接