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