nodejs/fs: 将 tar 写入内存缓冲区
nodejs/fs: writing a tar to memory buffer
我需要能够 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)
我也试过使用数组作为缓冲区,不开心。
下面的解决方案
creates the tar, then pipes it to some buffer and sends it immediately
和 great speed 感谢 tar-fs 库:
首先安装库 request
for simplified requests and tar-fs
,它为 tar-stream 提供文件系统绑定: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'))
我已将函数名称重命名为超级冗长。
我需要能够 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)
我也试过使用数组作为缓冲区,不开心。
下面的解决方案
creates the tar, then pipes it to some buffer and sends it immediately
和 great speed 感谢 tar-fs 库:
首先安装库 request
for simplified requests and tar-fs
,它为 tar-stream 提供文件系统绑定: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'))
我已将函数名称重命名为超级冗长。