Загрузить несколько файлов в SFTP с узла - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь загрузить несколько файлов на мой SFTP-сервер, но безуспешно.Я видел этот пример:

как мне отправить (поместить) несколько файлов с помощью nodejs ssh2-sftp-client?

Но это не кажется очень эффективнымметод, поскольку он открывает и закрывает соединение с сервером при каждой загрузке файла.Просто чтобы дать некоторый контекст, мое приложение может потенциально попытаться загрузить много тысяч файлов.Я отправляю массив имен файлов с клиента на сервер и вызываю SFTP.get, чтобы получить файл из удаленного местоположения, и SFTP.put этот поток файлов обратно в другое удаленное местоположение.Это делается с помощью модуля npm ssh2-sftp-client.

Я попытался загрузить несколько файлов, используя несколько разных методов, которые потерпели неудачу.

Во-первых:

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 голосов
/ 28 ноября 2018

Поскольку асинхронный обратный вызов выполняется при разрешении обещания, вне основного порядка выполнения, когда он выполняется, 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
  });
...