【问题标题】:File download - check for error before file write文件下载 - 在文件写入之前检查错误
【发布时间】:2016-10-13 05:45:33
【问题描述】:

我正在使用 Qt 从 HTTP 下载文件,为此,我使用了两个信号:

connect(currentDownload, SIGNAL(finished()),
        SLOT(downloadFinished()));
connect(currentDownload, SIGNAL(readyRead()),
        SLOT(downloadReadyRead()));

回调:

void DownloadManager::downloadFinished()
{
    output.close();

    if (currentDownload->error()) {
        // download failed
        std::cout << "Failed: [" << currentDownload->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()
                     << "] " << qPrintable(currentDownload->errorString()) << std::endl;
    } else {
        std::cout << "Download succeeded" << std::endl;
    }

    currentDownload->deleteLater();
    startNextDownload();
}

void DownloadManager::downloadReadyRead()
{
    output.write(currentDownload->readAll());
}

我遇到的问题是,如果在下载过程中由于某种原因出现任何错误,我无法弄清楚如何跳过写入输出文件。这不合逻辑——因为我只能在finished() 信号发射期间检查错误。在readyRead() 信号期间检查错误不会显示任何错误,即使它们存在。结果,404 输出文件将被写入磁盘。我该如何解决?

【问题讨论】:

    标签: c++ qt c++11 networking


    【解决方案1】:

    您应该使用QNetworkRequest 来获取所有信息。 参考这个example

    QNetworkAccessManager 提供更多信号来解决错误。

    QNetworkReply *reply = manager->get(request);
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(slotError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
            this, SLOT(slotSslErrors(QList<QSslError>)));
    

    【讨论】:

    • 所以基本上,我可以跳过readyRead() 信号并简单地将输出写入finished() 信号阶段?
    • @Lucas 我已经更新了答案,QNetworkReply 包含有关状态的信息。您应该阅读readyread,否则对于大文件,一次阅读将是一个问题。随着使用可以使用错误信号。如果解决了您的问题,请标记为已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2015-02-21
    • 2016-04-15
    • 2019-03-07
    • 2012-06-10
    • 2014-12-09
    相关资源
    最近更新 更多