2017-01-14 2 views
2

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

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

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 запущен узлом, не так ли?

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

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

+0

'sftp.get ('/ path/to/my/files /' + data [i] .name) 'возвращает поток. Вы должны обрабатывать этот поток и сохранять его как файл на вашем локальном компьютере. –

+0

Спасибо, не могли бы вы обратиться ко мне с командой sftp, которую я мог бы использовать для завершения этой задачи, то есть для обработки потока? Даже если модуль не реализует его, я мог бы использовать методы базового модуля ssh2. –

+0

Хорошо ... Я могу вам помочь. Вы хотите сохранить поток в виде файла? –

ответ

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 с этого письма), так что имейте это в виду, если вы столкнетесь с проблемами.

+0

Это дает мне: TypeError: sftp.get (...). Pipe не является функцией. Однако я понял ваше решение, и я буду исследовать его дальше. Благодаря!!! –

+0

Итак, документация модуля неверна/вводит в заблуждение. Он фактически возвращает * Promise *, который возвращает поток (скорее нечетный, так как нет ничего асинхронного в получении потока файлов). – mscdex

+0

Я вижу, да, иногда документация действительно бедна. И жаль. Я почти там, хотя get и pipe прерывают цикл for, и фактически загружается только последний файл. 'для (var i = 0; i { console.log (i); stream.pipe (fs.createWriteStream (localFilename)); }); } ' где первая консоль печатает 0,1,2,3,4,5, а вторая - 6 раз 5. –

-1

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

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) 
    }); 
} 
1
sftp.get(remoteFileNameWithPath, true).then(stream => { 
    stream.pipe(fs.createWriteStream(localFilePath)).on('close',() => console.log('completely passed file')) 
}) 

метод Get возвращает обещание с результатом потока, поэтому, для того, чтобы сохранить это нужно трубы до WriteStream Проверить документы на nodejs: https://nodejs.org/api/stream.html

Смежные вопросы