Javascript 无法从Node.js中的二进制缓冲区创建.tar.gz文件
我试图简单地从源Salesforce读取一个.tar.gz文件并将其保存到磁盘。我正在使用节点5.6.0中的库连接到Salesforce。当我检索一个.txt文件并保存它时,它工作正常,没有问题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');
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'}