QT中实现SFTP

时间:2024-03-13 18:37:02

最近由于项目需要,使用QSsh库实现SFTP功能,之前由于从来没有折腾过SFTP,所以有点费劲,网上的资料要求要下载libssh2和openssl,由于挺急的,所以直接从网上直接找了QT去和实现SFTP,整了大概有几天,总算把这个功能实现了,这里将代码给那些有这些需求的朋友,同时将具体步骤告知
1.打开pro文件
2.首先构建src目录,然后在构建SercureUpLoad目录

这个项目文件是在https://github.com/dushibaiyu/QSsh提供的项目之上理解,并进行改动,在此感谢提供此例子的朋友
由于本人之前对这方面也没有太多涉及,不足之处多多包涵,本人例子项目下载地址:

首先在SercureUpLoad目录下我封装了一个SZRSFtpTools类,这个类中包含SFTP的上传下载功能,懒得看代码,想直接使用的朋友直接更改pro文件,然后添加main.cpp文件可以直接测试函数是否可用
QT中实现SFTP
QT中实现SFTP
QT中实现SFTP
如果有朋友想将这个SFTP功能制作为一个动态库,那么上面的操作你可以不用进行,直接构建项目就行,这里要注意,因为我没有改动pro文件中动态库的生成路径,以本例子项目为例,生成的动态库存在于可执行程序下的目录,如下图
QT中实现SFTP
这里还要注意,这个功能必须要依赖QT提供的QSsh库,这个动态库在你执行构建SRC操作时,动态库就已经被制作成功,他生成在此例子下的lib目录
QT中实现SFTP
此例子,相对来说代码比较简单,我就简单讲一下上传文件代码实现步骤
1.设置SFTP服务器主机ip和用户名以及密码

void SZRSFtpTools::setSftpInfo(const QString &host, const QString &userName, const QString &pwd)
{
    m_sftp->setInfo(host,userName,pwd);
    m_host = host;
    m_userName = userName;
    m_pwd = pwd;
}

2.初始化QSsh::SshConnection类,并通过设置的信息连接服务器

if(m_connection)
        m_connection->disconnectFromHost();
    QSsh::SshConnectionParameters params;
    params.host = m_host;
    params.userName = m_userName;
    params.password = m_pwd;
    params.authenticationType = QSsh::SshConnectionParameters::AuthenticationTypePassword;
    params.timeout = 300;
    params.port = 22;
    m_connection = new QSsh::SshConnection(params, this); // TODO free this pointer!
    connect(m_connection, SIGNAL(connected()), SLOT(onConnected()));
    connect(m_connection, SIGNAL(error(QSsh::SshError)), SLOT(onConnectionError(QSsh::SshError)));

    qDebug() << "SecureUploader: Connecting to host" << m_host;

    m_connection->connectToHost();

3.在连接成功响应的槽函数中初始化通道

qDebug() << "SecureUploader: Connected";
    qDebug() << "SecureUploader: Creating SFTP channel...";

    m_channel = m_connection->createSftpChannel();

    if (m_channel) {
        connect(m_channel.data(), SIGNAL(initialized()),
                SLOT(downLoadFile()));
        connect(m_channel.data(), SIGNAL(initializationFailed(QString)),
                SLOT(onChannelError(QString)));
        connect(m_channel.data(), SIGNAL(finished(QSsh::SftpJobId, QString)),
                SLOT(onDownLoadfinished(QSsh::SftpJobId, QString)));
        m_channel->initialize();
    } else {
        qDebug() << "SecureUploader: Error null channel";
    }

4.通过响应通道创建成功的槽函数创建上传文件任务

QFileInfo fileInfo(DownFileName);
    QString SftpSavePath  = DownSavePath;
    SftpSavePath += "/";
    SftpSavePath += fileInfo.fileName();
    QSsh::SftpJobId job = m_channel->downloadFile(DownFileName,SftpSavePath,QSsh::SftpOverwriteExisting);
    if (job != QSsh::SftpInvalidJob) {
        qDebug() << "SecureUploader: Starting job #" << job;
    } else {
        emit loadError();
        qDebug() << "SecureUploader: Invalid Job";
    }