本文概述
SSH文件传输协议(SFTP), 也称为安全文件传输协议, 可实现网络主机之间的安全文件传输功能。
你可以在Cordova Android应用中使用此插件轻松创建图形sftp客户端。
要求
要在我们的Android Cordova应用中使用sftp功能, 我们将使用cordova-ourcodeworld-sftpplugin。该插件在后台使用JSCh(JSch-Java安全通道-JCraft), 并为以下常见任务提供支持:
- 安全连接。
- 列出远程路径。
- 上传文件。
- 下载文件。
- 删除远程文件。
- 使用私钥进行连接。
- 下载/上传进度指示器。
要在你的项目中安装, 请执行以下命令:
cordova plugin add https://github.com/sdkcarlos/cordova-ourcodeworld-sftpplugin.git
在此处阅读有关插件及其文档的更多信息。安装后, 在名为:OurCodeWorldSFTP的窗口中(在cordova的ondeviceready事件之后)将提供一个全局变量。
该插件仅适用于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攻击), 请使用setKnownHosts方法向客户端添加一个known_hosts文件, 该方法将设备中已知主机文件的路径作为第一个参数。
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);
}
});
玩得开心