我试图简单地从源(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文件,因此这些建议似乎没有帮助。
答案 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!#
希望这有助于你的情况。