【问题标题】:SFTP in node downloads blank files only节点中的 SFTP 仅下载空白文件
【发布时间】:2019-06-11 17:22:15
【问题描述】:

我一直在尝试从我的 SFTP 文件存储中下载一个文件到我的本地机器 - 并访问了许多堆栈帖子 - 就像这个:

SFTP modules in Node to download and delete files

但是,我无法让它工作。我有这个代码 - 这与 Mscdex 在我链接到的问题中发布的代码完全相同 - 但它不起作用。

const SFTPClient = require('ssh2-sftp-client');
const sftp = new SFTPClient();
const fs = require('fs');

sftp.connect({
    host: '206.189.113.33',
    port: '22',
    username: 'root',
    password: 'password'
}).then(() => {

    const remoteFilename = 'path/to/file.json';
    const localFilename = 'file.json';

    sftp.get(remoteFilename).then((stream) => {
        stream.pipe(fs.createWriteStream(localFilename));
    });

}).catch((err) => {
    console.log(err)
})

它确实会下载一个文件到我的本地机器 - 但是,这是一个完全空白的文件。起初我以为这是由于我需要下载的文件格式 - .csv.gz - 但即使使用简单的 .json 和 .html 文件进行测试,它仍然会下载一个空白文件。

谁能解释我为什么会遇到这个问题?我的最终目标是将文件作为流下载并通过响应标头将其推送到客户端浏览器。

更新

我找到了一种下载文件的方法,我没有使用 npm 模块 ssh2-sftp-client,而是使用了 npm 模块 ssh2。我可以使用以下代码下载文件:

var Client = require('ssh2').Client;
var connSettings = {
     host: '206.189.113.33',
     port: 22,
     username: 'root',
     password: 'password'
};

var conn = new Client();
conn.on('ready', function() {
    conn.sftp(function(err, sftp) {
        if (err) throw err;

        var moveFrom = "path/to/file.json";
        var moveTo = "file.json";

        sftp.fastGet(moveFrom, moveTo , {}, function(downloadError){
            stream.pipe(fs.createWriteStream(localFilename));
        });
    });
}).connect(connSettings);

但是,谁能告诉我如何使用此代码返回流而不是下载文件,因为我希望能够将流推送到客户端并在浏览器中下载文件。

非常感谢,

G

【问题讨论】:

  • 您是否尝试使用stream.on('data', (chunk) => console.log(chunk)); 记录数据?如果没有,请尝试此操作并检查您是否正在获取数据。
  • 嗨@RahulRaval,我刚刚用stream.on('data', (chunk) => console.log(chunk)); 替换了stream.pipe(fs.createWriteStream(localFilename));,根本没有输出
  • 好的,这意味着您读取的文件是空的,这就是您的本地文件不包含任何数据的原因。确保文件包含数据。
  • 文件不为空 - 当我拨入 SFTP 存储并获取文件时 - 它会下载并填充。终端也显示它不是空的:100% 726 28.4KB/s 00:00
  • 这很奇怪,因为如果文件包含数据,那么它应该记录在数据事件中。

标签: node.js ssh sftp ssh2-sftp ssh2


【解决方案1】:

所以这是我的解决方案:

var Client = require('ssh2').Client;
    var connSettings = {
         host: '206.189.113.33',
         port: 22,
         username: 'root',
         password: 'password'
    };

var conn = new Client();
conn.on('ready', function() {
    conn.sftp(function(err, sftp) {
        if (err) throw err;

        var moveFrom = "path/to/file.json";
        var moveTo = "file.json";

        sftp.fastGet(moveFrom, moveTo , {}, function(downloadError){
            if(downloadError) throw downloadError;

            var file = 'file.json';
            res.download(file)
        });
    });
}).connect(connSettings);

似乎 ssh2 npm 模块不允许下载流。相反,我只是将文件下载到服务器上,然后使用res.download()将其推送回浏览器以自动开始下载。

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多