C ++ Qt получает заголовки HTTP из QNetworkRequest

Я занимаюсь разработкой приложения Qt C ++. Мне нужно скачать несколько файлов (которые могут быть большими) и показать пользователю процесс загрузки. Для выполнения этой задачи я использую этот код:

QNetworkAccessManager* networkManager = new QNetworkAccessManager();

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
QNetworkReply reply = networkManager->get(request);
QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(downloadProgressChanged(qint64,qint64)));

куда downloadProgressChanged это слот с этим кодом:

void downloadProgressChanged(qint64 downloaded, qint64 total)
{
ui->progressBar->setValue(ui->progressBar->value() + 1);
ui->labelProgress->setText(QString::number((downloaded / 1024)));
}

(Я использую QProgressBar по имени progressBar чтобы показать прогресс и QLabel по имени labelProgress показать скачанные килобайты).

Моя проблема в том, что я не могу получить доступ к заголовку Content-Length (int fileSize значение равно 0) и поэтому я не могу показать ход операции. Я проверил заголовки HTTP на своем веб-сервере — Content-Length работает нормально.

В этот ТАК вопрос Я прочитал, что я могу использовать QNetworkReply::metaDataChanged() сигнал, но как я могу использовать его, чтобы показать прогресс? Документация гласит, что сигнал может испускаться при загрузке уже началось, но мне нужно получить содержимое заголовка до начнется загрузка — настроить мой прогрессбар.

0

Решение

Вы пробовали использовать сигнал ReadyRead? И в слоте вы можете подготовить графический интерфейс. Что-то вроде этого должно сделать работу:

connect(reply, SIGNAL(readyRead()), this, SLOT(updateProgressBar()))
1

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

Это не то, как вы получите информацию заголовка из запроса:

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);

Попробуйте выполнить запрос с помощью QNetworkAccessManager, а затем получите нужный заголовок из ответа, который он возвращает. Существует специальный метод для извлечения только информации заголовка из запроса:

QNetworkAccessManager::head(const QNetworkRequest & request)

Поскольку сетевой API Qt является асинхронным, вы должны подключить сигнал завершения (QNetworkReply *) QNetworkAccessManager к слоту и получить информацию заголовка в слоте.

Вот как я это сделаю:

void MainWindow::on_download_button_clicked(){
QUrl url("http://someurl");
QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getHeaders(QNetworkReply*)));
manager->head(QNetworkRequest(url));
}

void MainWindow::getHeaders(QNetworkReply * reply){
if (reply->operation() == QNetworkAccessManager::HeadOperation){
int content_length = reply->header(QNetworkRequest::ContentLengthHeader).toInt();
}
}
5

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