Протокол передачи файлов SSH (SFTP), также известный как протокол безопасной передачи файлов, обеспечивает возможности безопасной передачи файлов между сетевыми узлами.
Вы можете легко создать графический клиент sftp, используя этот плагин в своем приложении Cordova для Android.
Требования
Чтобы использовать функцию sftp в нашем приложении Android Cordova, мы будем использовать cordova-ourcodeworld-sftpplugin
, Этот плагин использует JSCh (JSch — безопасный канал Java — JCraft) под капотом и предлагает поддержку для следующих общих задач:
- Безопасное соединение.
- Укажите удаленный путь.
- Загрузить файлы.
- Скачать файлы.
- Удалить удаленный файл.
- Используйте закрытый ключ для подключения.
- Индикатор прогресса загрузки / выгрузки.
Для установки в вашем проекте выполните следующую команду:
cordova plugin add https://github.com/sdkcarlos/cordova-ourcodeworld-sftpplugin.git
Подробнее о плагине и его документации читайте здесь. После установки глобальная переменная будет доступна (после события ondeviceready cordova) в окне с именем: OurCodeWorldSFTP.
Этот плагин работает только для Android.
Реализация клиента sftp
Вам необходимо выполнить следующие шаги, чтобы правильно использовать плагин:
- Создайте SFTP-клиент.
- Используйте созданный клиент для выполнения всех предусмотренных задач плагина.
Для создания клиента используйте createSFTPClient
метод:
/**
* A client object to download/upload/delete files using SFTP.
*
* return {Object}
*/
var client = OurCodeWorldSFTP.createSFTPClient();
Теперь, когда у нас есть клиент, укажите правильные учетные данные, чтобы начать использовать плагин.
Если вы используете закрытый ключ:
// Remote path to list
var pathToList = "/var/www/vhosts/myproject";
var myCredential = {
//or use the ip instead
//url: "127.0.0.1 etc..."
url: "myserver.something.com",
username : null,
password : null,
// The path to the .pub local file in your device
privateKeyPath : "/storage/emulated/0/id_dsa.pub"
};
client.setCredentials(myCredential.url, myCredential.username, myCredential.password);
client.setPath(pathToList);
client.setIdentity(myCredential.privateKeyPath);
Или, если вы используете имя пользователя и пароль:
// Remote path to list
var pathToList = "/var/www/vhosts/myproject";
var myCredential = {
//or use the ip instead
//url: "127.0.0.1 etc..."
url: "myserver.something.com",
username : "root",
password : "rootpassword",
};
client.setCredentials(myCredential.url, myCredential.username, myCredential.password);
client.setPath(pathToList);
Если вы хотите повысить безопасность соединения (и предотвратить атаки MITM), добавьте в файл файл known_hosts, используя метод setKnownHosts, который в качестве первого параметра ожидает путь к файлу известных хостов в устройстве.
client.setKnownHosts("/storage/emulated/0/known_hosts");
Теперь, когда учетные данные действительны, вы можете использовать любые задачи, которые предоставляет плагин.
Перечислите путь
Укажите путь, используя list
метод (обратите внимание, что путь был установлен с помощью setPath
метод в предыдущем коде, вы можете динамически изменить его с помощью этого метода):
/**
* Receives an array with objects with all the content of a path (files and folders)
*/
var success = function(data) {
console.info(data);
/**
Outputs :
[
{
name:"Folder/File name",
filepath: "/var/www/vhosts/myproject/something.txt",
isDir:false, // is Folder = true, is File = false
isLink:false,
size:"123", // bytes
permissions: "????",
permissions_string:"xxxxx",
}
];
*/
}
var failure = function(e) {
console.error(e);
}
client.list(success, failure);
Скачайте файл и покажите прогресс
Чтобы скачать файл, используйте downloadFile
метод клиента. Эта функция ожидает в качестве первого параметра удаленный путь к файлу, а в качестве второго параметра — файл назначения на устройстве и, наконец, обратные вызовы.
Обратите внимание, что путь к локальному файлу не использует file://
префикс. Вместо этого используйте относительный путь, схема Android FileURI не поддерживается.
client.downloadFile("/var/www/vhosts/myproject/file.txt","/storage/emulated/0/file.txt",{
success:function(download){
// see the object info
console.log(download);
// If the download has been finished
if(download.finished == true){
console.info("The file has been succesfully downloaded");
// Else is stills being downloaded
}else{
//Display the progress
console.log("Progress download : "+download.progress+"%. "+ download.bytesprogress +" bytes downloaded of " + download.filesizebytes + "total");
}
},
error:function(er){
console.error(er);
}
});
Загрузить файл и показать прогресс
Для загрузки файла используйте uploadFile
метод клиента. Эта функция в качестве первого параметра ожидает путь к файлу на устройстве, а в качестве второго параметра — файл назначения на сервере удаления и, наконец, обратные вызовы.
client.uploadFile("/storage/emulated/0/file.txt","/var/www/vhosts/myproject/file.txt",{
success:function(upload){
// see the object info
console.log(upload);
// if the file has been uploaded
if(upload.finished == true){
console.info("The file has been succesfully uploaded");
}else{
//Display the progress as it still being downloaded
console.log("Progress upload : "+upload.progress+"%. "+ upload.bytesprogress +" bytes uploaded of " + upload.filesizebytes + "total");
}
},
error:function(er){
console.error(er);
}
});
Удалить файл
Чтобы удалить файл, используйте метод removeFile клиента. Эта функция ожидает в качестве первого параметра удаленный путь к файлу (на сервере) и, наконец, обратные вызовы.
client.removeFile("/var/www/vhosts/myproject/file.txt",{
success:function(removed){
// see the object info
console.log(removed);
if(download.deleted == true){
console.log("File removed from the server");
}
},
error:function(er){
// snap ! An error :( maybe doesnt exist?
console.error(er);
}
});
Повеселись