从节点

时间:2018-11-27 09:33:18

标签: 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

1 个答案:

答案 0 :(得分:2)

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

这样,您就可以像这样兑现承诺(我现在无法检查):

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