node.js - 从 Node 上传多个文件到 SFTP

标签 node.js sftp ssh2-sftp

我正在尝试将多个文件上传到我的 SFTP 服务器,但没有成功。我看过这个例子:

how do I send (put) multiple files using nodejs ssh2-sftp-client?

但这似乎不是一个非常有效的方法,因为它会在每次文件上传时打开和关闭与服务器的连接。只是为了提供一些背景信息,我的应用程序可能会尝试上传数千个文件。我将文件名数组从客户端发送到服务器,并调用 SFTP.get 从远程位置获取文件,然后 SFTP.put 该文件流返回到另一个远程位置。这是通过 ssh2-sftp-client npm 模块完成的。

我尝试使用几种不同的方法上传多个文件,但都失败了。

首先:

for (var i=0; i<10; i++) {

      sftp.get('filepath/testFile.csv').then((stream) => {
            sftp.put(stream, 'newfilepath/testFile' + i + '.csv');
      })

}

这只是尝试获取同一文件并每次使用不同的文件名上传 10 次。但是,当我查看我的服务器时:

Uploaded file

仅上传最后一个文件 - 查看日志时,它实际上只是尝试上传 testFile10.csv 10 次,而不是 testFile1.csv、testFile2.csv 等...

其次:

var files = ['testFile.csv', 'testFile2.csv']

    for (var i=0; i<2; i++) {

        sftp.get('filepath/' + files[i]).then((stream) => {
            sftp.put(stream, 'newfilepath/testFile' + i + '.csv');
        })

    }

这只是尝试上传 2 个文件。但是,与上一个示例一样,仅上传了最后一个文件 - 在本例中为 testFile2.csv。

有什么建议可以让我让它发挥作用吗?是否可以将多个文件放入 for 循环中?这看起来在技术上并不困难,我只是不明白为什么它甚至不尝试从 0 到 10 循环,而只是尝试将 testFile10 放入 10 次。

这是一个相当关键的技术障碍,我需要在最后期限内克服它,因此我非常感谢您能提供的任何帮助。

提前非常感谢,

G

最佳答案

因为异步回调在 Promise 解决时运行,在主执行顺序之外,所以当它运行时,i 已经等于数组的长度。因此它只上传最后一个文件。

所以你可以用 promise 来做到这一点,就像这样(我现在无法检查):

const files = ['testFile.csv', 'testFile2.csv'];

const promises = files.map(async file => {
  const stream = await sftp.get(`filepath/${file}`);
  sftp.put(stream, file);
});

Promise.all(promises)
  .then(results => {
    console.log('all files have been uploaded');
    // do something
  })
  .catch(e => {
    console.error(e);
    // handle error
  });

关于node.js - 从 Node 上传多个文件到 SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53496548/

相关文章:

javascript - 为从 ssh2-sftp-client 中的缓冲区上传的文件分配名称?

node.js - 使用 aws lambda nodejs 从 SFTP 服务器访问和复制文件

javascript - 使用Electron jS应用程序的应用程序启动器

node.js - 如何在node js中获取mongoDB集合大小?

python - 使用 pysftp 或 Paramiko,如何获得包含属性的完整目录列表?

javascript - 尝试使用 Gulp SFTP 插件进行部署时出现最大堆栈错误

javascript - 从对象数组中删除对象项并在 Node js中分组

node.js - 如何设置 headless chrome 的超时

java - VFS2 错误无法删除文件并且无法获取当前用户的组 ID(错误代码 : -1)

javascript - ssh2连接到多个服务器并获取输出nodejs