nodejs/fs: запись tar в буфер памяти
Мне нужно уметь tar
каталог и отправить его на удаленную конечную точку через HTTP PUT
,
Конечно, я мог бы создать tar-файл, сохранить его на диске, затем снова прочитать и отправить.
Но я бы предпочел создать tar, затем направить его в какой-нибудь буфер и немедленно отправить. Я не смог этого добиться.
Код до сих пор:
var tar = require('tar');
var fs = require("fs");
var path = "/home/me/uploaddir";
function getTar(path, cb) {
var buf = new Buffer('');
var wbuf = fs.createWriteStream(buf);
wbuf.on("finish", function() {
cb(buf);
});
tar.c({file:""},[path]).
pipe(wbuf);
}
getTar(path, function(tar) {
//send the tar over http
});
Этот код приводит к:
fs.js:575
binding.open(pathModule._makeLong(path),
^
TypeError: path must be a string
at TypeError (native)
at Object.fs.open (fs.js:575:11)
Я также пытался использовать массив в качестве буфера, без радости.
1 ответ
Следующее решение
создает tar, затем направляет его в некоторый буфер и немедленно отправляет
и с большой скоростью благодаря библиотеке tar-fs:
Сначала установите библиотеки request
для упрощенных запросов и tar-fs
, который обеспечивает привязки файловой системы для tar-потока: npm i -S tar-fs request
var tar = require('tar-fs')
var request = require('request')
var fs = require('fs')
// pack specific files in the directory
function packTar (folderName, pathsArr) {
return tar.pack(folderName, {
entries: pathsArr
})
}
// return put stream
function makePutReq (url) {
return request.put(url)
}
packTar('./testFolder', ['test.txt', 'test1.txt'])
.pipe(makePutReq('https://www.example.com/put'))
Я переименовал имена функций в супер многословные.