【问题标题】:Unable to create .tar.gz file from binary buffer in Node.js无法从 Node.js 中的二进制缓冲区创建 .tar.gz 文件
【发布时间】:2016-07-28 04:11:18
【问题描述】:

我试图简单地从源 (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 和流处理程序将我的 Buffer 转换为 Stream,但它不起作用。我也尝试过流缓冲区,但我遇到了同样的问题。

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 文件,因此那里的建议似乎没有帮助。

【问题讨论】:

  • 您将需要使用像 archiver 这样的归档库来处理 tar 文件。

标签: javascript node.js buffer gzip tar


【解决方案1】:

您的问题是您希望将字符串或缓冲区压缩并写入 zip 文件,而变量“读取”实际上是普通缓冲区流,而不是压缩流。

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

如果您使用 node 基础的 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!#

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

【讨论】:

  • 感谢这里的信息——这有点帮助,但我真正的问题是我已经从我的 HTTP 请求中获得了这个二进制数据并在它上面调用 zlib.gzip 并没有有意义,因为它已经被压缩了。我也尝试了 zlib.inflate/unzip,然后尝试将结果写入文件,但我得到类似的错误:{ [错误:不正确的标头检查] errno:-3,代码:'Z_DATA_ERROR'}
猜你喜欢
  • 2015-05-09
  • 2020-05-10
  • 2010-09-06
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多