2016-07-28 3 views
0

Я пытаюсь просто прочитать файл .tar.gz из источника (Salesforce) и сохранить его на диске. Я использую библиотеку jsforce в узле (5.6.0) для подключения к Salesforce. Когда я извлекаю .txt-файл и сохраняю его - он отлично работает без проблем.Невозможно создать файл .tar.gz из двоичного буфера в Node.js

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

Для работы с файлами tar вам понадобится библиотека архивирования, такая как 'archiver'. – dnak

ответ

-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!# 

Надеюсь, это поможет вашему делу.

+1

Спасибо за информацию здесь - это немного помогает, но моя реальная проблема в том, что у меня есть эти двоичные данные, уже поступающие из моего HTTP-запроса, и вызов zlib.gzip на нем не имеет смысла, потому что он уже gzipped. Я также попытался zlib.inflate/unzip, а затем попытался записать результат этого файла, но получаю схожие ошибки: {[Ошибка: неправильная проверка заголовка] errno: -3, code: 'Z_DATA_ERROR'} –

Смежные вопросы