使用Rxjs将多个文件上载到sftp服务器
你好!我想实现一种方便的方法,将多个文件上传到sftp服务器,方法是将每个上传的文件回调到服务器 我已经尝试实现了一些有效的代码,但我发现存在内存泄漏,不允许在所有下载之后成功关闭与sftp服务器的连接 不断地打开和关闭连接对我来说绝对不重要 我从这里稍微调整了一下代码: 代码: 使用 如果将文件上载到sftp服务器时出错,则连接不会关闭,并且在打开自定义控制台时无法重新连接。我想将代码转换为Rxjs以提供更好的支持,我认为我可以解决关闭连接和应用程序响应性的问题 确保您使用的是最新版本的ssh2 sftp客户端-最近有大量更新,包括更一致地处理错误并确保正确关闭连接的修复。v4.1.0 您正在“键盘交互”上使用sftp。。。。模块中没有发出此类事件的内容,因此此侦听器将不会激发 如果您只想上传文件,请使用fastPut方法。速度快得多。确保目标路径包括远程文件名,而不仅仅是远程目录 看一看承诺。你可以用这个代替承诺池,我想它会更干净。有点像未经测试的使用Rxjs将多个文件上载到sftp服务器,rxjs,sftp,es6-promise,Rxjs,Sftp,Es6 Promise,你好!我想实现一种方便的方法,将多个文件上传到sftp服务器,方法是将每个上传的文件回调到服务器 我已经尝试实现了一些有效的代码,但我发现存在内存泄漏,不允许在所有下载之后成功关闭与sftp服务器的连接 不断地打开和关闭连接对我来说绝对不重要 我从这里稍微调整了一下代码: 代码: 使用 如果将文件上载到sftp服务器时出错,则连接不会关闭,并且在打开自定义控制台时无法重新连接。我想将代码转换为Rxjs以提供更好的支持,我认为我可以解决关闭连接和应用程序响应性的问题 确保您使用的是最新版本的ssh
function sftpPutFiles(config, files, pathToDir, callbackStep, callbackFinish, callbackError) {
let Client = require('ssh2-sftp-client');
let PromisePool = require('es6-promise-pool');
const sendFile = (config, pathFrom, pathTo) => {
return new Promise(function (resolve, reject) {
let sftp = new Client();
console.log(pathFrom, pathTo);
sftp.on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => { finish([config.password]); });
sftp.connect(config).then(() => {
return sftp.put(pathFrom, pathTo);
}).then(() => {
console.log('finish '+pathTo);
callbackStep(pathTo);
sftp.end();
resolve(pathTo);
}).catch((err) => {
console.log(err, 'catch error');
callbackError(err);
});
});
};
// Create a pool.
let indexFile = 0;
let pool = new PromisePool(() => {
while (indexFile < files.length) {
let file = files[indexFile];
indexFile++;
return sendFile(config, file.path, `${pathToDir}/${file.name}`);
}
return null;
}, 10);
pool.start().then(function () {
console.log({"message":"OK"}); // res.send('{"message":"OK"}');
callbackFinish();
});
}
input.addEventListener('change', function (e) {
e.preventDefault();
sftpPutFiles(
{host: '192.168.2.201', username: 'crestron', password: 'ehAdmin'},
this.files,
`./Program01/test/`,
pathTo => {
let tr = document.createElement('tr');
let bodyTable = document.querySelector('.body');
tr.innerHTML = `<td>${bodyTable.children.length+1}</td><td>${pathTo}</td><td>OK</td>`;
bodyTable.appendChild(tr);
}, () => {
alert('Всё файлы загружены');
},
err => {
alert('Ошибка: '+err);
}
);
});
let localPath = '/path/to/src-dir';
let remotePath = '/path/to/dst-dir';
let files = ['file1.txt', file2.txt','file3.txt'];
let client = new Client();
client.connect(config)
.then(() => {
let promises = [];
files.forEach(f => {
let from = path.join(localPath, f);
let to = path.join(remotePath, f);
promise.push(client.fastPut(from, to));
});
return Promise.all(promises);
}).then(res => { // res is array of resoved promise results
client.end();
}).catch(err => {
// deal with error
});