Qt 下载文件 - QNetworkAccessManager,未获取数据

Posted

技术标签:

【中文标题】Qt 下载文件 - QNetworkAccessManager,未获取数据【英文标题】:Qt Download File - QNetworkAccessManager, not getting data 【发布时间】:2013-02-26 23:01:52 【问题描述】:

我正在尝试让我的应用程序从 URL 下载文件,通常是 EXE 或 Jar,但这并不是说应该有太大变化。我让这一切都在一个线程中运行,但我认为这不会有所作为(如果它确实让我知道的话)。

所以 Do_Download 是我创建管理器、设置 URL 和请求并执行获取的函数。然后我尝试将完成的信号连接到将写入文件的插槽。

void DownloadManager::Do_Download() 
    QNetworkAccessManager *netManager = new QNetworkAccessManager(this);
    QUrl url(install_mirror); //istall_mirror is the URL provided by user
    QNetworkRequest req(url);

    QNetworkReply *reply = netManager->get(req);

    connect(reply, SIGNAL(finished()), this, SLOT(writeData()));

我的 writeData 函数检查错误,如果没有错误,它会将数据写入文件。

void DownloadManager::writeData() 
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());

    if (reply) 
        if (reply->error() == QNetworkReply::NoError) 
            QFile file(location);
            if(file.open(QIODevice::WriteOnly)) 
                    file.write(reply->readAll());
             else 
                errorMessage = "Error writing downloaded file for mirror installation";
            
         else 
            //get http status code
            int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
            errorMessage = "HTTP Error code while downloading from mirror: " + httpStatus;
        

        reply->deleteLater();
     else 
        errorMessage = "Error downloading file from installation mirror";
    

问题是没有数据被写入。它只是创建一个 0Kb 文件。 我尝试添加一个下载进度槽,这样我就可以看到接收数据的情况。所以我将此添加到我的 Do_Download 方法中。

connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(DL_Progress(qint64,qint64)));

void DownloadManager::DL_Progress(qint64 recieved, qint64 total) 
    std::cout << recieved << " / " << total << endl;

输出显示一次为 0 / 01

我做错了什么?

【问题讨论】:

你有 QCoreApplication 对象和事件循环在执行吗? 【参考方案1】:

我在您的代码中看到的唯一问题是您没有等待下载完成。 NetworkRequest 对象将在函数调用结束时被破坏。

所以,我会这样重写 Do_Download(QEventLoop 同步网络请求):

void DownloadManager::Do_Download() 
    QEventLoop eventLoop;
    QNetworkAccessManager *netManager = new QNetworkAccessManager(this);
    QUrl url(install_mirror); //istall_mirror is the URL provided by user
    QNetworkRequest req(url);

    QNetworkReply *reply = netManager->get(req);

    connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
    eventLoop.exec();

    writeData(reply);

【讨论】:

以上是关于Qt 下载文件 - QNetworkAccessManager,未获取数据的主要内容,如果未能解决你的问题,请参考以下文章

用 Qt 下载文件?

在 QT 中下载许多文件

使用 Qt 浏览器下载 excel 文件作为附件

Qt5:下载文件而不保存到硬盘

Qt、QNetworkAccess Manager下载大文件频繁失败

QT 使用 QNetworkAccessManager 下载文件