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