【问题标题】:nodejs/fs: writing a tar to memory buffernodejs/fs:将 tar 写入内存缓冲区
【发布时间】:2017-07-01 05:35:54
【问题描述】:

我需要能够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)

我也尝试过使用数组作为缓冲区,不开心。

【问题讨论】:

  • 呃?似乎您正在将长度为 0 的缓冲区传递给 fs.createWriteStream,这最终会导致错误
  • 我知道这一点,但是,当我首先创建一个目录的 tar 时,我不知道它的大小,应该如何分配缓冲区?

标签: node.js fs


【解决方案1】:

以下解决方案

创建 tar,然后将其通过管道传输到某个缓冲区并立即发送

还有great speed 感谢 tar-fs 库:

首先安装库request 用于简化请求和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'))

我已将函数名称重命名为超级详细。

【讨论】:

  • 这看起来不错,虽然我在最后一步遇到了麻烦,但它可能是我们的 PUT 端点,所以仍在努力。谢谢你现在
  • 尝试使用requestb.in 这样.pipe(makePutReq('https://requestb.in/<unique_path_here>')) 来测试它是代码还是端点
  • 我的端点收到 400 错误请求,https://requestb.in/mylittletest' 收到 404 Not Found。我实际上是在做:tar.pack(path).pipe(request.put('https://requestb.in/mylittletest').on("response", function(res) {....}),以便真正知道请求是否成功。
  • 问题在于在标题中设置内容类型,所以它可以工作。谢谢!
猜你喜欢
  • 2012-10-03
  • 2017-05-21
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2015-08-20
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多