Qt下载文件- QNetworkAccessManager,没有得到数据

Qt Download File - QNetworkAccessManager, not getting data

本文关键字:数据 下载 文件 QNetworkAccessManager Qt      更新时间:2023-10-16

我试图让我的应用程序从URL下载文件,通常是EXE或Jar,而不是这应该改变太多。我有这一切都运行在一个线程,但我不认为会有什么不同(如果它让我知道)。

Do_Download是我的函数,它创建管理器,设置URL和请求,并执行get。然后尝试将完成的信号连接到将写入文件的插槽。
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

我做错了什么?

我在你的代码中看到的唯一问题是你没有等待下载完成。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);
}