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.

0

Решение

В вашем коде есть несколько проблем:

  1. Вам нужно открыть tmpFile прежде чем писать в него.
  2. reply->readAll() вернет данные только один раз. Дальнейшие вызовы вернут пустой массив. Как только вы получили данные, используя readAllВы несете ответственность за сохранение его в переменной, если оно понадобится вам позже.
  3. После того, как вы записали что-то в файл, указатель файла находится в его конце. Вы ничего не можете прочитать с него, потому что там нет данных. Ты можешь использовать seek переместить указатель на начало файла и прочитать его содержимое.
  4. Нет смысла читать из файла только после того, как вы записали в него данные. Ты можешь использовать QTextStream на QNetworkReply непосредственно читать текст из него. (Может быть, это было только для отладки, я не знаю.)
  5. Трудно поверить, что вам нужно создать временный файл только для расчета md5. Есть более простые способы сделать это.
1

Другие решения

Оказывается, я был глуп и забыл открыть ответ первым. Кроме того, мне не нужно было создавать временный файл. Вот мое решение:

void MainWindow::fileIsReady( QNetworkReply * reply)
{
if (reply->error() == QNetworkReply::NoError)
{
if (reply->open(QIODevice::ReadOnly))
{
QByteArray asdf = reply->readAll();

qDebug() << (QString("asdf %1").arg(asdf.length()));

qDebug() << (QString(asdf));
}
else
{
qDebug << "cant open reply";
}
}
}
0

По вопросам рекламы [email protected]