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