Node 中用于下载和删除文件的 SFTP 模块
SFTP modules in Node to download and delete files
我的任务很(或者更好,应该是)简单:从 Node 应用程序中获取 SFTP 目录的内容,然后下载其中的所有文件,最后远程删除它们。
现在,我检查了不同的模块。在我看来,非常干净的是 ssh2-sftp-client。我可以这样使用它:
let Client = require('ssh2-sftp-client');
let sftp = new Client();
sftp.connect({
host: myhost,
port: '22',
username: myusername,
password: mypassword
}).then(() => {
return sftp.list('/path/to/my/files');
}).then((data) => {
for(var i = 0 ; i < data.length; i++) {
sftp.get('/path/to/my/files/'+data[i].name);
}
}).catch((err) => {
console.log(err, 'catch error');
});
我可以列出所有文件并在控制台中查看结果 jSon,但是 .get 命令似乎什么都不做,我不知道哪里出了问题。从文档 (https://www.npmjs.com/package/ssh2-sftp-client) 中,您可以像我一样简单地获取文件。但是:
1) 好像不行
2)我怎样才能调试发生了什么?
3)如果我没有机会选择本地目录,这些文件很可能会被下载到node启动js的地方,对吧?
那么,如果使用此模块(或其他模块,如果有的话)成功下载文件,我如何获取实际下载并可能被远程删除的文件?
谢谢,
法比奥
sftp.get()
returns a Promise returns 一个流,所以如果你想将流保存到磁盘,你将需要通过管道传输它。例如:
var fs = require('fs');
// ...
for(var i = 0; i < data.length; i++) {
const remoteFilename = '/path/to/remote/files/' + data[i].name;
const localFilename = '/path/to/local/files/' + data[i].name;
sftp.get(remoteFilename).then((stream) => {
stream.pipe(fs.createWriteStream(localFilename));
});
}
此外,ssh2-sftp-client
似乎没有使用 ssh2
模块的最新版本分支(撰写本文时为 v0.5.x),因此请记住这一点,如果你 运行 遇到问题。
我不确定会发生什么,但是当我 运行 这样的代码时,它只会下载一个文件。
for (var i = fileList.length - 1; i >= 0; i--) {
remoteFilename = process.env.FTP_DEFAULT_DIR + '/' + fileList[i].name
localFilename = fileList[i].name
sftp.get(remoteFilename).then((stream) => {
stream.pipe(fs.createWriteStream(localFilename));
console.log(stream);
console.log('processing: ', remoteFilename);
}).catch((err)=> {
console.log(err)
});
}
sftp.get(remoteFileNameWithPath, true).then(stream => {
stream.pipe(fs.createWriteStream(localFilePath)).on('close', () => console.log('completely passed file'))
})
get 方法 returns 一个带有流结果的承诺,因此,为了保存它,您需要通过管道传输到 writeStream
检查 nodejs 上的文档:https://nodejs.org/api/stream.html
使用 get() 方法下载并保存文件
sftp.get(remote_file_path, local_file_path).then((stream) => {
console.log('File download Success')
});
需要两个参数:src和dest文件路径
我的任务很(或者更好,应该是)简单:从 Node 应用程序中获取 SFTP 目录的内容,然后下载其中的所有文件,最后远程删除它们。
现在,我检查了不同的模块。在我看来,非常干净的是 ssh2-sftp-client。我可以这样使用它:
let Client = require('ssh2-sftp-client');
let sftp = new Client();
sftp.connect({
host: myhost,
port: '22',
username: myusername,
password: mypassword
}).then(() => {
return sftp.list('/path/to/my/files');
}).then((data) => {
for(var i = 0 ; i < data.length; i++) {
sftp.get('/path/to/my/files/'+data[i].name);
}
}).catch((err) => {
console.log(err, 'catch error');
});
我可以列出所有文件并在控制台中查看结果 jSon,但是 .get 命令似乎什么都不做,我不知道哪里出了问题。从文档 (https://www.npmjs.com/package/ssh2-sftp-client) 中,您可以像我一样简单地获取文件。但是:
1) 好像不行 2)我怎样才能调试发生了什么? 3)如果我没有机会选择本地目录,这些文件很可能会被下载到node启动js的地方,对吧?
那么,如果使用此模块(或其他模块,如果有的话)成功下载文件,我如何获取实际下载并可能被远程删除的文件?
谢谢, 法比奥
sftp.get()
returns a Promise returns 一个流,所以如果你想将流保存到磁盘,你将需要通过管道传输它。例如:
var fs = require('fs');
// ...
for(var i = 0; i < data.length; i++) {
const remoteFilename = '/path/to/remote/files/' + data[i].name;
const localFilename = '/path/to/local/files/' + data[i].name;
sftp.get(remoteFilename).then((stream) => {
stream.pipe(fs.createWriteStream(localFilename));
});
}
此外,ssh2-sftp-client
似乎没有使用 ssh2
模块的最新版本分支(撰写本文时为 v0.5.x),因此请记住这一点,如果你 运行 遇到问题。
我不确定会发生什么,但是当我 运行 这样的代码时,它只会下载一个文件。
for (var i = fileList.length - 1; i >= 0; i--) {
remoteFilename = process.env.FTP_DEFAULT_DIR + '/' + fileList[i].name
localFilename = fileList[i].name
sftp.get(remoteFilename).then((stream) => {
stream.pipe(fs.createWriteStream(localFilename));
console.log(stream);
console.log('processing: ', remoteFilename);
}).catch((err)=> {
console.log(err)
});
}
sftp.get(remoteFileNameWithPath, true).then(stream => {
stream.pipe(fs.createWriteStream(localFilePath)).on('close', () => console.log('completely passed file'))
})
get 方法 returns 一个带有流结果的承诺,因此,为了保存它,您需要通过管道传输到 writeStream 检查 nodejs 上的文档:https://nodejs.org/api/stream.html
使用 get() 方法下载并保存文件
sftp.get(remote_file_path, local_file_path).then((stream) => {
console.log('File download Success')
});
需要两个参数:src和dest文件路径