我正在尝试在解压缩时读取gzip压缩文件的一部分,这样我就可以解析头部内容而无需读取不必要的字节.我之前使用fs.read()工作,同时传递选项只读取前500个字节,然后使用zlib.gunzip()解压缩内容,然后从二进制数据解析头.
这个工作正常,直到节点v5.0.0修补了一个错误,以确保zlib在截断的输入(https://github.com/nodejs/node/pull/2595)上抛出错误.
现在我从zlib收到以下错误.
Error: unexpected end of file
如何知道我在截断输入而不抛出错误的情况下解压缩这个部分文件.我认为使用流可能更容易,所以我写了以下内容.
var readStream = fs.createReadStream(file.path,{start: 0,end: 500}); var gunzip = zlib.createGunzip(); readStream.pipe(gunzip) .on('data',function(chunk) { console.log(parseBinaryHeader(chunk)); console.log('got %d bytes of data',chunk.length); }) .on('error',function (err) { console.log(err); }) .on('end',function() { console.log('end'); });
我的parseBinaryHeader()函数正在返回正确的标题内容,所以我知道它是解压缩但是当它到达输入结束时它仍然会抛出错误.我可以添加错误监听器来处理错误,并且不做任何事情,但这似乎并不理想.
有任何想法吗?
解决方法
感谢所有的建议.我还向节点存储库提交了一个问题,并获得了一些很好的反馈.这是最终为我工作的东西.
>将块大小设置为完整标头大小.
>将单个块写入解压缩流并立即暂停流.
>处理解压缩的块.
例
var bytesRead = 500; var decompressstream = zlib.createGunzip() .on('data',function (chunk) { parseHeader(chunk); decompressstream.pause(); }).on('error',function(err) { handleGunzipError(err,file,chunk); }); fs.createReadStream(file.path,end: bytesRead,chunkSize: bytesRead + 1}) .on('data',function (chunk) { decompressstream.write(chunk); });
到目前为止,这一直在工作,并且允许我继续处理所有其他gunzip错误,因为pause()阻止解压缩流抛出“意外的文件结束”错误.
原文地址:https://www.jb51.cc/nodejs/241226.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。