c++ - 使用 Qt 下载公共(public)保管箱文件

标签 c++ qt dropbox

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

curl -v -L http://www.dropbox.com/s/ehoawgm89yz6pib/version.txt?raw=1

而且确实有效。它需要 -L 进行重定向。我不太了解 curl 但我确实看到了重定向 HTTP/2 302 然后是正常请求

< 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

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

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,但是 readAll 上没有任何内容。始终为空字符串。

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

最佳答案

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

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);

关于c++ - 使用 Qt 下载公共(public)保管箱文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45867580/

相关文章:

c++ - 正则表达式性能 : Boost vs. Perl

用于嵌入 iframe 的 Dropbox 文件链接

C++ 字符串错误

c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?

c++ - 解析引用 | Exe/Dll 与 Lib

c++ - 最大化qt中单实例应用程序的已运行实例

linux - 使用 Qt 显示网络摄像头视频

qt - 如何在Qt中设置时区?

android - 避免将 .jar 打包到 Android 库 (.aar) 中

python - 使用 python 访问 Google Drive/Dropbox 中的文件