SFTP в узле загружает только пустые файлы - PullRequest
0 голосов
/ 17 января 2019

Я уже некоторое время пытаюсь загрузить файл из моего хранилища файлов SFTP на мой локальный компьютер - И посетил несколько стековых сообщений - Как этот:

SFTP-модули в узле для загрузки и удаления файлов

Однако я не могу заставить его работать. У меня есть этот код - который в точности совпадает с кодом, опубликованным 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 он все равно загружает пустой файл.

Может кто-нибудь пролить свет на то, почему я сталкиваюсь с этой проблемой? Моя конечная цель - загрузить файл в виде потока и отправить его в браузер на стороне клиента через заголовки ответа.

UPDATE

Я нашел способ загрузить файл, вместо использования 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

1 Ответ

0 голосов
/ 17 января 2019

Итак, вот мое решение:

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(), чтобы отправить его обратно в браузер, чтобы автоматически начать загрузку.

...