如何在Node中通过ssh传输大文件?

时间:2015-06-01 03:31:02

标签: node.js ssh stream

我正在尝试使用ssh2模块传输cat命令,但它只是在执行的某个时刻挂起。我正在执行cat there.txt,其中.txt约为10 MB左右。

例如:

local = fs.createWriteStream('here.txt');
conn.exec('cat there.txt', function(err, stream) {
     if (err) throw err;
     stream.pipe(local).on('finish, function() { console.log('Done'); });
}

这一点完全停止了。我甚至将流传输到本地stdout,它只是暂停了一段时间。在我的实际代码中,我通过一堆其他转换流进行管道传输,所以我认为这比首先将文件传输到本地系统更好(文件可能大于200MB)。

2 个答案:

答案 0 :(得分:0)

试用 createReadStream 来提供巨大的文件:

fs.exists(correctfilepath, function(exists) {
  if (exists) {
    var readstream = fs.createReadStream(correctfilepath);

    console.log("About to serve " + correctfilepath);

    res.writeHead(200);
    readstream.setEncoding("binary");

    readstream.on("data", function (chunk) {
        res.write(chunk, "binary");
    });

    readstream.on("end", function () {
        console.log("Served file " + correctfilepath);
        res.end();
    });

    readstream.on('error', function(err) {
        res.write(err + "\n");
        res.end();
        return;
    });
  } else {
    res.writeHead(404);
    res.write("No data\n");
    res.end();
  }
});

答案 1 :(得分:0)

我最近刚开始使用流,所以当我通过各种转换流管道ssh流时,我并没有像我在我的示例中那样以可写流结束(我应该包含我的实际代码,抱歉!)。这导致它挂起。这最初是为了让我可以远程执行多个命令并将其输出分类到一个文件中。

所以,我的原始代码是mergesort-stream,然后在完成后将transformStream推送到数组。然后使用j + 1 npm模块对其进行排序。而不是那样,我只是将多个ssh命令(转换)的结果写入临时文件,然后一次对它们进行排序。