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'))

Я переименовал имена функций в супер многословные.

Другие вопросы по тегам