Qt - pobieranie pliku z internetu

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 2204 razy

Dwie klasy będą niezbędne do pobrania pliku z internetu. Pierwszą z nich jest QNetworkAccessMenager, zaś drugą QNetworkReply. Do realizacji zadania pobierania danych z internetu konieczne będzie utworzenie klasy, której deklaracja będzie wyglądała następująco:

#ifndef DOWNLOADER_H #define DOWNLOADER_H #include <QObject> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QUrl> #include <QDateTime> #include <QFile> #include <QDebug> class Downloader : public QObject{ Q_OBJECT QString fileNameEndPath; // ścieżka wraz z nazwą pliku zapisu ściągniętych danych public: explicit Downloader(QObject *parent = 0); void doDownload(QUrl urlPath, QString fileName); // metoda realizująca pobieranie danych signals: public slots: void replyFinished (QNetworkReply *reply); // slot wywoływany przy zakończeniu pobierania pliku void downloadProgress(qint64,qint64); // slot wykorzystywany do przetwarzania informacji o pobieranych danych private: QNetworkAccessManager *manager; QNetworkRequest request; }; #endif // DOWNLOADER_H

Natomiast poszczególne metody w pliku downloader.cpp będą wyglądały tak:

#include "downloader.h" Downloader::Downloader(QObject *parent) : QObject(parent){ manager = new QNetworkAccessManager(this); // tworzenie nowego obiektu menadżera dostępu QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); // połączenie sygnału zakończenia pobierania } void Downloader::doDownload(QUrl urlPath, QString fileName){ this->fileNameEndPath = fileName; // przypisanie ścieżki do pliku request.setUrl(urlPath); // ustawienie adresu url żądania QNetworkReply *reply = manager->get(request); // wysłanie żądania QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64))); // podpięcie pod sygnał postępu pobierania } void Downloader::replyFinished (QNetworkReply *reply){ // wywoływany, gdy pobieranie zostanie zakończone if(reply->error()){ // jeżeli wystąpił błąd, to qDebug() << "Error:" << reply->errorString(); }else{ // jeżeli nie to qDebug() << "Naglowek strony:" << reply->header(QNetworkRequest::ContentTypeHeader).toString(); qDebug() << "Kod satusu serwera:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "Wyjasnienie bledu (jezeli istnieja):" << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); QFile file(fileNameEndPath); if(file.open(QFile::WriteOnly)){ file.write(reply->readAll()); file.flush(); file.close(); } } reply->deleteLater(); // konieczne, aby zwolnić pamięć po zakończeniu żywota obiektu tego } void Downloader::downloadProgress(qint64 bytesReceived, qint64 bytesTotal){ qDebug() << "Pobrano:" << bytesReceived << "z" << bytesTotal; // ile pobrano z ilu }

W końcu użycie klasy Downloader w pliku main.cpp:

#include <QCoreApplication> #include <QTextStream> #include "downloader.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream str(stdin); qDebug() << "Podaj adres strony:"; QString myURL = str.readLine(); Downloader downloader; // tworzenie obiektu klasy Downloader downloader.doDownload(QUrl(myURL), "file.txt"); // pobieranie danych return a.exec(); }

Przykładowy wynik działania powyższego kodu:

Podaj adres strony:
http://www.obliczeniowo.com.pl
Pobrano: 8105 z -1
Pobrano: 37681 z 37681
Naglowek strony: "text/html;charset=UTF-8"
Kod satusu serwera: 200
Wyjasnienie bledu (jezeli istnieja): "OK"
Strony powiązane
strony powiązane
  1. /doc.qt.io/qt-5/qnetworkaccessmanager.html - opis klasy QNetworkAccessManager na stronie dokumentacji biblioteki Qt
  2. doc.qt.io/qt-5/qnetworkrequest.html - opis klasy QNetworkRequest na stronie dokumentacji biblioteki Qt
Propozycje książek