使用Qt下载公共Dropbox文件

时间:2017-08-24 17:20:46

标签: c++ qt dropbox

我在Dropbox上有一个带有版本字符串的公共txt文件,例如vid.play()。我用curl测试了下载

2017.09.01

它确实有效。它需要curl -v -L http://www.dropbox.com/s/ehoawgm89yz6pib/version.txt?raw=1 进行重定向。我不太了解卷曲,但我确实看到重定向-L然后是正常请求

HTTP/2 302

然后我尝试使用一个非常简单的请求类来使用Qt,例如:

< HTTP/2 200
< content-disposition: inline; filename="version.txt"; filename*=UTF-8''version.txt
< ...
<
2017.09.01
* Connection #1 to host dl.dropboxusercontent.com left intact

在调试时,我看到重定向,再次调用MyClass::MyClass() { auto manager = new QNetworkAccessManager(this); QNetworkRequest request(checkURL); connect(manager, &QNetworkAccessManager::finished, this, &MyClass::replyFinished); m_Reply = manager->get(request); } void MyClass::replyFinished(QNetworkReply *reply) { QUrl redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirect.isValid() && reply->url() != redirect) { if (redirect.isRelative()) { redirect = reply->url().resolved(redirect); } reply->manager()->get(QNetworkRequest(redirect)); return; } const auto newVersion = QString(reply->readAll()); // Do something with the version } ,但replyFinished上没有任何内容。总是一个空字符串。

在发布答案之前,请使用我提供的链接进行测试!我的代码已经适用于大多数其他链接。

2 个答案:

答案 0 :(得分:1)

默认情况下,重定向已关闭。这是一个应该有效的代码片段:

auto manager = new QNetworkAccessManager();

QObject::connect(manager, &QNetworkAccessManager::finished,
        [&](QNetworkReply* repl) {
    qDebug() << repl->readAll();
});
QNetworkRequest req(QUrl("http://www.dropbox.com/s/ehoawgm89yz6pib/version.txt?raw=1"));
req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
req.setMaximumRedirectsAllowed(3);
QNetworkReply* reply = manager->get(req);

答案 1 :(得分:0)

我的坏。我倾向于忽略一些警告,因为其中有一些我无法解决。原来这些警告并非无用!这应该是错误,而不是警告。

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

您必须在Windows上安装OpenSSL或在其他操作系统上使用您的软件包管理器。否则,reply对象只返回一个空字符串。