最近由于项目需要,使用QSsh库实现SFTP功能,之前由于从来没有折腾过SFTP,所以有点费劲,网上的资料要求要下载libssh2和openssl,由于挺急的,所以直接从网上直接找了QT去和实现SFTP,整了大概有几天,总算把这个功能实现了,这里将代码给那些有这些需求的朋友,同时将具体步骤告知
1.打开pro文件
2.首先构建src目录,然后在构建SercureUpLoad目录
这个项目文件是在https://github.com/dushibaiyu/QSsh提供的项目之上理解,并进行改动,在此感谢提供此例子的朋友
由于本人之前对这方面也没有太多涉及,不足之处多多包涵,本人例子项目下载地址:
首先在SercureUpLoad目录下我封装了一个SZRSFtpTools类,这个类中包含SFTP的上传下载功能,懒得看代码,想直接使用的朋友直接更改pro文件,然后添加main.cpp文件可以直接测试函数是否可用
如果有朋友想将这个SFTP功能制作为一个动态库,那么上面的操作你可以不用进行,直接构建项目就行,这里要注意,因为我没有改动pro文件中动态库的生成路径,以本例子项目为例,生成的动态库存在于可执行程序下的目录,如下图
这里还要注意,这个功能必须要依赖QT提供的QSsh库,这个动态库在你执行构建SRC操作时,动态库就已经被制作成功,他生成在此例子下的lib目录
此例子,相对来说代码比较简单,我就简单讲一下上传文件代码实现步骤
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";
}