Javascript 无法从Node.js中的二进制缓冲区创建.tar.gz文件

Javascript 无法从Node.js中的二进制缓冲区创建.tar.gz文件,javascript,node.js,buffer,gzip,tar,Javascript,Node.js,Buffer,Gzip,Tar,我试图简单地从源Salesforce读取一个.tar.gz文件并将其保存到磁盘。我正在使用节点5.6.0中的库连接到Salesforce。当我检索一个.txt文件并保存它时,它工作正常,没有问题 conn.requestGet('/services/data/v37.0/sobjects/ContentVersion/XXXX/VersionData', {}, function(err, data) { var bitmap = new Buffer(data, 'binary');

我试图简单地从源Salesforce读取一个.tar.gz文件并将其保存到磁盘。我正在使用节点5.6.0中的库连接到Salesforce。当我检索一个.txt文件并保存它时,它工作正常,没有问题

conn.requestGet('/services/data/v37.0/sobjects/ContentVersion/XXXX/VersionData', {}, function(err, data) {
  var bitmap = new Buffer(data, 'binary');
  fs.writeFileSync('new_file.txt', bitmap, {
    encoding: 'binary'
  });
});
但是我在尝试将文件保存为.tar.gz时遇到了问题。如果我使用相同的fs.writeFileSync,则文件将保存,但格式不正确,无法打开。在下面的代码中,我使用and Streamizer将缓冲区转换为流,但它不起作用。我也尝试过流缓冲区,但我遇到了同样的问题

conn.requestGet('/services/data/v37.0/sobjects/ContentVersion/XXXX/VersionData', {}, function(err, data) {
  var bitmap = new Buffer(data, 'binary');
  var read = streamifier.createReadStream(bitmap);
  var write = targz().createWriteStream('new_file.tar.gz');
  read.pipe(write);
});
我得到的错误是:

events.js:154
  throw er; // Unhandled 'error' event
  ^ 
Error: incorrect header check
at Zlib._handle.onerror (zlib.js:363:17)

我的问题似乎与之类似,但由于我使用的是.tar.gz文件,因此那里的建议似乎没有帮助

本例中的问题是,您希望压缩字符串或缓冲区并将其写入zip文件,而变量“read”实际上是一个普通的缓冲流,而不是压缩的缓冲流

类似地,tar.gz模块和targz函数的问题在于,它既不提供将普通数据写入压缩流的机制,也不提供文档中的清晰性。我花了一些时间阅读文档,并意识到它的设计仅适用于文件和文件夹,而不适用于内存中的数据

如果使用来自节点基础的ZLIB模块,您的问题可以容易地、干净地解决。

#cat t.js
var fs = require('fs');
var zlib = require('zlib');

var str = 'hello compressed world!';
zlib.gzip(str, function(err, buffer) {
  if(err) {
    console.log(err);
    return;
  }
  fs.writeFile('./foo.gz', buffer, function(err, b) {
  if(err) {
    console.log(err);
    return;
  }
});
});
#node t.js
#file foo.gz
foo.gz: gzip compressed data, from Unix
#gunzip foo.gz
foo already exists -- do you wish to overwrite (y or n)? y
#cat foo
hello compressed world!#

希望这对您的情况有所帮助。

您需要使用归档库(如archiver)来处理tar文件。感谢这里的信息-这有点帮助,但我真正的问题是,我的HTTP请求中已经有了这些二进制数据,因此调用zlib.gzip没有意义,因为它已经被gzip压缩了。我还尝试了zlib.inflate/unzip,然后尝试将结果写入文件,但我得到了类似的错误:{[Error:Error header check]errno:-3,代码:'Z_DATA_Error'}