c++ - Qt 使用 QNetworkReply 获取网络请求,将数据下载到临时文件

标签 c++ qt qnetworkreply

我在读取联机文件时遇到一些问题。在将文件下载到临时文件后,我正在尝试读取文件中的内容。这是我的代码:

void MainWindow::fileIsReady( QNetworkReply * reply)
{
    QTemporaryFile tmpFile;
    tmpFile.write(reply->readAll());

    QByteArray asdf = reply->readAll();
    qDebug() (QString("%1").arg(asdf.length())); // returns 0

    if (tmpFile.open())
    {
        qDebug << "attempting to read file";

        QTextStream stream(&tmpFile);
        QString value = stream.readAll();
        qDebug << value; // value is returning nothing
    }
    else
    {
        qDebug() << "failed to open internet file";
    }
}

// in MainWindow constructor (MainWindow::MainWindow)...


QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileIsReady(QNetworkReply*)) );
manager->get(QNetworkRequest(QUrl("https://www.website.com/stuff/file.exe.md5")));

我将使用它来比较两个 md5 字符串。

最佳答案

您的代码中存在几个问题:

  1. 您需要在写入之前打开 tmpFile
  2. reply->readAll() 只会返回一次数据。进一步调用将返回空数组。使用 readAll 收到数据后,您有责任将其存储在变量中,以备日后需要时使用。
  3. 将内容写入文件后,文件指针位于其末尾。您无法从中读取任何内容,因为那里没有数据。您可以使用 seek 将指针移动到文件的开头并读取其内容。
  4. 在向文件写入数据后立即读取文件是没有意义的。您可以直接在 QNetworkReply 上使用 QTextStream 来从中读取文本。 (也许这只是为了调试,我不知道。)
  5. 很难相信您需要创建一个临时文件来计算 md5。有更简单的方法可以做到这一点。

关于c++ - Qt 使用 QNetworkReply 获取网络请求,将数据下载到临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412019/

相关文章:

c++ - const_cast 的奇怪行为

c++ - QPainter怎么转? (从工厂函数中 move 一个对象)

c++ - Qt 将类连接到 MainWindow

c++ - QByteArray 从文本转换

c++ - 如何增加 QNetworkReply::downloadProgress 信号频率?

python - PyQT5为什么get请求响应总是为null

c++ - 模板不够灵活,重载导致代码重复怎么办

c++ - OpenMP/C++ : Parallel for loop with reduction afterwards - best practice?

c++ - 为什么我不能用大括号括起来的初始化列表构造队列/堆栈? (C++11)

qt - 连接丢失时未检测到 QNetworkReply 错误信号