使用Rxjs将多个文件上载到sftp服务器

使用Rxjs将多个文件上载到sftp服务器,rxjs,sftp,es6-promise,Rxjs,Sftp,Es6 Promise,你好!我想实现一种方便的方法,将多个文件上传到sftp服务器,方法是将每个上传的文件回调到服务器 我已经尝试实现了一些有效的代码,但我发现存在内存泄漏,不允许在所有下载之后成功关闭与sftp服务器的连接 不断地打开和关闭连接对我来说绝对不重要 我从这里稍微调整了一下代码: 代码: 使用 如果将文件上载到sftp服务器时出错,则连接不会关闭,并且在打开自定义控制台时无法重新连接。我想将代码转换为Rxjs以提供更好的支持,我认为我可以解决关闭连接和应用程序响应性的问题 确保您使用的是最新版本的ssh

你好!我想实现一种方便的方法,将多个文件上传到sftp服务器,方法是将每个上传的文件回调到服务器

我已经尝试实现了一些有效的代码,但我发现存在内存泄漏,不允许在所有下载之后成功关闭与sftp服务器的连接

不断地打开和关闭连接对我来说绝对不重要

我从这里稍微调整了一下代码:

代码:

使用

如果将文件上载到sftp服务器时出错,则连接不会关闭,并且在打开自定义控制台时无法重新连接。我想将代码转换为Rxjs以提供更好的支持,我认为我可以解决关闭连接和应用程序响应性的问题

确保您使用的是最新版本的ssh2 sftp客户端-最近有大量更新,包括更一致地处理错误并确保正确关闭连接的修复。v4.1.0

您正在“键盘交互”上使用sftp。。。。模块中没有发出此类事件的内容,因此此侦听器将不会激发

如果您只想上传文件,请使用fastPut方法。速度快得多。确保目标路径包括远程文件名,而不仅仅是远程目录

看一看承诺。你可以用这个代替承诺池,我想它会更干净。有点像未经测试的

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
    });