使用 QNetworkAccessManager 通过 SSH2 协议上传文件

Posted

技术标签:

【中文标题】使用 QNetworkAccessManager 通过 SSH2 协议上传文件【英文标题】:Upload file via SSH2 protocol using QNetworkAccessManager 【发布时间】:2015-09-24 12:38:40 【问题描述】:

我需要在端口 22 上使用 ssh2 协议在服务器上上传图像文件。带有 QNetworkAccessManger 的 SSH2 协议在 Google 上也不流行。这是我的代码。

QUrl uploadUrl("ssh2://192.168.10.227/var/www/html/img/"+mImgFile);

    uploadUrl.setUserName("xxxxxx");
    uploadUrl.setPassword("xxxxxx");
    uploadUrl.setPort(22);

    qDebug() << uploadUrl.toString();

    QNetworkRequest uploadReq(uploadUrl);

    mReply = mNetworkManager->put(uploadReq, &file);

    connect(mReply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));

URL-scheme 为“ssh2”或“sftp”或“ssh2.sftp”;它输出协议未知。而我使用看起来很奇怪的“ssh2.sftp”的原因是here(just a little php code to view)。

我想知道 ssh2 是否可以与 qnetworkaccessmanager 一起使用?如果是,上传图片文件的正确 URL 格式是什么?

【问题讨论】:

【参考方案1】:

Qt 中不支持 SSH,例如参见 Howto implement SFTP with Qt/QNetworkAccessManager (C++) 和 How to easily establish an SSH connection in Qt?

QNetworkAccessManager 中支持的 URL 方案列表可以通过QNetworkAccessManager::supportedSchemes() 获得,即默认 Qt 版本中的("ftp", "file", "qrc", "http", "https", "data")(仅当找到外部 OpenSSL 库时才支持https,因为它也没有提供Qt)。

因此,仍然需要使用外部 C 库 libssh2 来使用原生套接字来处理 SSH2 协议。

我发现here 有一些旧的Qt 扩展LibQxt 支持Qt SSH。但是,它不再维护。

【讨论】:

@Jatin 很高兴它有帮助。你有一个链接器错误。如果您使用外部库,则应将其显式添加到项目中(例如 .pro 文件)以进行正确链接。如果您对此有疑问,那么使用您已完成的步骤和观察到的问题打开一个具有清晰问题描述(QxtSshClient 和 libssh2 与 Qt 项目的集成)的新问题是有意义的。这样,更多人将参与解决某些特定问题。 您的回答肯定很有帮助:) 我对从here 下载的 QxtSshClient 类和从您上面的链接下载的 libssh2 付出了更多努力。但是现在我得到了一个 undefined reference to `libssh2_channel_process_startup' 此类错误的列表,即使文件“libssh2.h”已包含在内。我不知道这些库还需要做什么。请问还有什么帮助吗?对不起,我在之前的评论中拼错了你的名字。所以,删除它。 是的。该文件也包含在 .pro 文件中。即使那样,我也会收到此错误。不管怎样,很高兴得到你的帮助。 @Jatin 我的意思是不只是在 .pro 中包含“libssh2.h”。在 C/C++ 中,构建包括两个主要阶段:编译器将源文件编译为目标文件,以及链接器将编译的目标文件链接起来。编译器包含“libssh2.h”就足够了,但是将所有二进制文件收集到一个可执行文件中的链接器也应该知道您想要链接一些外部库二进制文件。变量LIB 在.pro 文件中用于链接器所需的两个步骤:(1) 添加路径以搜索外部二进制文件和(2) 链接库。见doc.qt.io/qt-5/third-party-libraries.html 我浏览了建议的链接。在 INCLUDEPATH 使用之前一直很好。但是因为下载的“libssh2”不包含任何库文件(我的 Fedora 22 操作系统的.so),所以一直使用 LIBS。现在怎么走?

以上是关于使用 QNetworkAccessManager 通过 SSH2 协议上传文件的主要内容,如果未能解决你的问题,请参考以下文章

离线使用 QNetworkAccessManager

跨 dll 使用 QNetworkAccessManager

使用 QNetWorkAccessManager 将值传递给插槽

如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP

如何使用 QNetworkAccessManager 找出数据传输延迟

使用 QNetworkAccessManager 时如何处理代理