节点中的 SFTP 仅下载空白文件
SFTP in node downloads blank files only
我一直在尝试将文件从我的 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 文件进行测试,它仍然会下载一个空白文件.
谁能解释一下为什么我 运行 关注这个问题?我的最终目标是将文件作为流下载并通过响应 headers.
将其推送到客户端浏览器
更新
我找到了下载文件的方法,而不是使用 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);
但是,谁能告诉我如何使用此代码 return 流而不是下载文件,因为我希望能够将流推送到客户端并在浏览器中下载文件。
非常感谢,
G
所以这是我的解决方案:
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()
将其推送回浏览器以自动开始下载。
我一直在尝试将文件从我的 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 文件进行测试,它仍然会下载一个空白文件.
谁能解释一下为什么我 运行 关注这个问题?我的最终目标是将文件作为流下载并通过响应 headers.
将其推送到客户端浏览器更新
我找到了下载文件的方法,而不是使用 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);
但是,谁能告诉我如何使用此代码 return 流而不是下载文件,因为我希望能够将流推送到客户端并在浏览器中下载文件。
非常感谢,
G
所以这是我的解决方案:
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()
将其推送回浏览器以自动开始下载。