Qt - pobieranie pliku z internetu

Stronę tą wyświetlono już: 17 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:

Listing 1
  1. #ifndef DOWNLOADER_H
  2. #define DOWNLOADER_H
  3. #include <QObject>
  4. #include <QNetworkAccessManager>
  5. #include <QNetworkRequest>
  6. #include <QNetworkReply>
  7. #include <QUrl>
  8. #include <QDateTime>
  9. #include <QFile>
  10. #include <QDebug>
  11. class Downloader : public QObject{
  12. Q_OBJECT
  13. QString fileNameEndPath; // ścieżka wraz z nazwą pliku zapisu ściągniętych danych
  14. public:
  15. explicit Downloader(QObject *parent = 0);
  16. void doDownload(QUrl urlPath, QString fileName); // metoda realizująca pobieranie danych
  17. signals:
  18. public slots:
  19. void replyFinished (QNetworkReply *reply); // slot wywoływany przy zakończeniu pobierania pliku
  20. void downloadProgress(qint64,qint64); // slot wykorzystywany do przetwarzania informacji o pobieranych danych
  21. private:
  22. QNetworkAccessManager *manager;
  23. QNetworkRequest request;
  24. };
  25. #endif // DOWNLOADER_H

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

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

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

Listing 3
  1. #include <QCoreApplication>
  2. #include <QTextStream>
  3. #include "downloader.h"
  4. int main(int argc, char *argv[])
  5. {
  6. QCoreApplication a(argc, argv);
  7. QTextStream str(stdin);
  8. qDebug() << "Podaj adres strony:";
  9. QString myURL = str.readLine();
  10. Downloader downloader; // tworzenie obiektu klasy Downloader
  11. downloader.doDownload(QUrl(myURL), "file.txt"); // pobieranie danych
  12. return a.exec();
  13. }

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

Komentarze