SFTP-модули в Node для загрузки и удаления файлов

Моя задача (или, что лучше, должна быть) проста: извлечь содержимое каталога в SFTP из приложения Node, затем загрузить все файлы и, наконец, удалить их удаленно.

Теперь я проверил разные модули. Очень чистым, на мой взгляд, является ssh2-sftp-client. Я могу использовать это так:

let Client = require('ssh2-sftp-client');
let sftp = new Client();

sftp.connect({
    host: myhost,
    port: '22',
    username: myusername,
    password: mypassword
}).then(() => {
    return sftp.list('/path/to/my/files');
}).then((data) => {

    for(var i = 0 ; i < data.length; i++) {
        sftp.get('/path/to/my/files/'+data[i].name); 
        }   
}).catch((err) => {
    console.log(err, 'catch error');
});

Я могу перечислить все файлы и увидеть полученный jSon в консоли, но команда.get, похоже, ничего не делает, и я понятия не имею, что не так. Из документации ( https://www.npmjs.com/package/ssh2-sftp-client) вы можете получить файлы, как я делаю. Но:

1) кажется, что это не работает 2) как я могу отладить, что происходит? 3) если у меня нет возможности выбрать локальный каталог, будут ли эти файлы, скорее всего, загружены там, где js запускается узлом, верно?

Итак, как я могу получить файлы, фактически загруженные и, возможно, удаленно удаленные, если они были успешно загружены с помощью этого модуля (или других, если таковые имеются)?

Спасибо Фабио

3 ответа

Решение

sftp.get() возвращает Promise, который возвращает поток, поэтому, если вы хотите сохранить поток на диск, вам нужно будет передать его по конвейеру. Например:

var fs = require('fs');

// ...

for(var i = 0; i < data.length; i++) {
  const remoteFilename = '/path/to/remote/files/' + data[i].name;
  const localFilename = '/path/to/local/files/' + data[i].name;
  sftp.get(remoteFilename).then((stream) => {
    stream.pipe(fs.createWriteStream(localFilename));
  });
}

Кроме того, кажется, что ssh2-sftp-client не использует последнюю версию ветки ssh2 модуль (v0.5.x на момент написания статьи), так что имейте это в виду, если у вас возникнут проблемы.

sftp.get(remoteFileNameWithPath, true).then(stream => {
  stream.pipe(fs.createWriteStream(localFilePath)).on('close', () => console.log('completely passed file'))
})

метод get возвращает обещание с результатом потока, поэтому, чтобы сохранить его, вам необходимо передать документацию к документу writeStream Check на nodejs: https://nodejs.org/api/stream.html

Загрузите и сохраните файл, используя метод get()

sftp.get(remote_file_path, local_file_path).then((stream) => {
    console.log('File download Success')
}); 

Требуется два параметра: путь к файлу src и dest

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

for (var i = fileList.length - 1; i >= 0; i--) {

  remoteFilename = process.env.FTP_DEFAULT_DIR + '/' + fileList[i].name
  localFilename = fileList[i].name

  sftp.get(remoteFilename).then((stream) => {
    stream.pipe(fs.createWriteStream(localFilename));
    console.log(stream);
    console.log('processing: ', remoteFilename);
  }).catch((err)=> {
    console.log(err)
  });
}
Другие вопросы по тегам