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

时间:2016-07-28 04:11:19

标签: javascript node.js buffer gzip tar

我试图简单地从源(Salesforce)读取.tar.gz文件并将其保存到磁盘。我正在使用Node(5.6.0)中的jsforce库连接到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 - 那么该文件将保存,但它的格式不正确,我无法打开它。在下面的代码中,我使用tar.gz和流化器将我的缓冲区转换为流,但它不起作用。我也试过流缓冲区,但我遇到了同样的问题。

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)

我的问题似乎与Node.js: Download file from s3 and unzip it to a string相似,但由于我使用的是.tar.gz文件,因此这些建议似乎没有帮助。

1 个答案:

答案 0 :(得分:-1)

你的问题是你想要一个字符串或一个缓冲区被压缩并写入一个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!#

希望这有助于你的情况。