SFTP в узле загружает только пустые файлы

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

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

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


person GeorgeBT1902    schedule 17.01.2019    source источник
comment
Вы пытались регистрировать данные с помощью stream.on('data', (chunk) => console.log(chunk));? Если нет, попробуйте это и проверьте, получаете ли вы данные или нет.   -  person Rahul Raval    schedule 17.01.2019
comment
Привет, @RahulRaval, я только что заменил stream.pipe(fs.createWriteStream(localFilename)); на stream.on('data', (chunk) => console.log(chunk));, и ничего не вышло.   -  person GeorgeBT1902    schedule 17.01.2019
comment
хорошо, это означает, что файл, который вы читаете, пуст, поэтому ваш локальный файл не содержит никаких данных. Убедитесь, что файл содержит данные.   -  person Rahul Raval    schedule 17.01.2019
comment
Файл не пуст. Когда я подключаюсь к хранилищу SFTP и ПОЛУЧАЮ файл, он загружается и заполняется. Терминал также показывает, что он не пуст: 100% 726 28.4KB/s 00:00   -  person GeorgeBT1902    schedule 17.01.2019
comment
Это странно, потому что если файл содержит данные, то он должен быть зарегистрирован в событии данных.   -  person Rahul Raval    schedule 17.01.2019
comment
Я знаю. Вот почему я так запутался. Кроме того, как показывает обновление моего вопроса, используя другой модуль npm для доступа к моему SFTP, он действительно загружает файл. Так что проблем с моими файлами нет.   -  person GeorgeBT1902    schedule 17.01.2019


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

person GeorgeBT1902    schedule 17.01.2019