首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用nodejs ssh2-sftp-client发送(上传)多个文件?

如何使用nodejs ssh2-sftp-client发送(上传)多个文件?
EN

Stack Overflow用户
提问于 2018-05-25 11:45:53
回答 3查看 9.1K关注 0票数 0

如果我尝试超过10个文件,我得到了警告,但其他文件没有上传,我不能上传超过10个文件。我做错了什么?

{节点:17472) MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个就绪的侦听器。使用emitter.setMaxListeners()增加限制(节点:17472) MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个错误监听程序。使用emitter.setMaxListeners()增加限制(节点:17472) MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个近距离监听程序。使用emitter.setMaxListeners()增加限制}

代码语言:javascript
复制
 let Client = require('ssh2-sftp-client');
    let sftp = new Client();
    var promises = [];
    for(var i=0; i < 12; i++) {
        promises.push(sendFile(sftp, req.body, results.romlist[i].filename));
    }
    Promise.all(promises).then(function() {
        sftp.end();
        res.send('{"message":"OK"}');
    });
      const sendFile = (sftp, config, filename) => {
console.log(filename);
return sftp.connect(config).then(() => {
    return sftp.put(filename, "/home/pi/RetroPie/roms/atari2600/" + filename.substr(filename.lastIndexOf('/')+1));
}).catch((err) => {
    console.log(err, 'catch error');
});};
EN

回答 3

Stack Overflow用户

发布于 2018-05-25 13:27:35

下面的代码使用es6-promise-pool作为示例,它对我来说很有效:

首先需要安装es6-promise-pool:

代码语言:javascript
复制
npm install es6-promise-pool --save

代码:

代码语言:javascript
复制
let Client = require('ssh2-sftp-client');
let PromisePool = require('es6-promise-pool');

var files = [ (list of files to transfer) ]; // results.romlist[i].filename
var config = { (sftp config) };

const sendFile = (config, filename) => {
    return new Promise(function (resolve, reject) {
    let sftp = new Client();
    console.log(filename);
    sftp.on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => { finish([config.password]); });
    sftp.connect(config).then(() => {
        return sftp.put("(local path)" + filename, "/home/pi/RetroPie/roms/atari2600/" + filename);
    }).then(() => {
        console.log('finish '+filename);
        sftp.end();
        resolve(filename);
    }).catch((err) => {
        console.log(err, 'catch error');
    });
  });
};

var count = 0;
var sendFileProducer = function () {
    console.log("count="+count);
    if (count < 100) {
        count++;
        return(sendFile(config, files[count]));     
    } else {
        return null;
    }
}

// The number of promises to process simultaneously.
var concurrency = 10;

// Create a pool.
var pool = new PromisePool(sendFileProducer, concurrency)

pool.start().then(function () {
    console.log({"message":"OK"}); // res.send('{"message":"OK"}');
});

代码没有针对网络流量进行优化,因为它会为每个文件启动SFTP。但是,它仍然是非常有效的,因为您可以控制适合不同情况的并发。

票数 2
EN

Stack Overflow用户

发布于 2020-05-30 05:22:51

这对我来说很有效:https://github.com/theophilusx/ssh2-sftp-client/issues/73

代码语言:javascript
复制
const putFiles = (sftpConfig, fileList) => {
  const sftp = new sftpClient()
  return new Promise(function(resolve, reject) {
    sftp
    .connect(sftpConfig)
    .then(() => {
      return Promise.all(fileList.map(args => {
        return sftp.put.apply(sftp, args)
      }))
    })
    .then(() => sftp.end())
    .then(resolve)
    .catch(reject)
  });
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-12 11:58:03

npm包"sftp- upload “可以帮助我将一个目录中的10个以上的文件上传到远程服务器。你可以参考这个:https://www.npmjs.com/package/sftp-upload

请在nodejs中找到下面的示例代码,我已经测试过了,它可以工作。请用您的必填数据替换字段:

  • username:sftp服务器的用户名。

包含要上载到服务器的文件的目录(在本地系统中)的

  • path:路径。

要上载文件的远程目录中的

  • remoteDir:Path。

代码语言:javascript
复制
var SftpUpload = require('sftp-upload');
var fs = require('fs');
         
       sftp2 = new SftpUpload({
            host:'remote ip address',
            username:'username',
            password:'****',
            path: '/user/Desktop/test1',
            remoteDir: '/user/Desktop/test1',
            excludedFolders: ['**/.git', 'node_modules'],
            exclude: ['.gitignore', '.vscode/tasks.json'],
            dryRun: false
        });
     
        sftp2.on('error', function(err) {
            throw err;
        })
        .on('uploading', function(progress) {
            console.log('Uploading', progress.file);
            console.log(progress.percent+'% completed');
        })
        .on('completed', function() {
            console.log('Upload Completed');
        })
        .upload();

此代码会将本地系统中"test1“目录中的所有文件复制到远程服务器中的"test1”目录中。如果远程服务器中不存在"test1“目录,则会自动创建该目录并复制文件。

如果"test1“目录中有子文件夹,那么该子文件夹及其内容也会被复制到远程机器上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50521222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档