如何在Android中使用Cordova创建SFTP客户端

本文概述

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客户端

你需要按照以下步骤操作才能正确使用插件:

  1. 创建一个SFTP客户端。
  2. 使用创建的客户端执行插件提供的所有任务。

要创建客户端, 请使用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);
    }
});

玩得开心

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?