- 1. Projektstruktur
- 2. Widget.h
- 3. Widget.cpp
- 4. Insgesamt
Networking in Qt 5 verwendet das Modul Network , und Sie können die Klasse QNetworkAccessManager aktiv verwenden, um über das Netzwerk zu kommunizieren, es sei denn, Sie erstellen Ihr eigenes Protokoll für die Kommunikation. Aber um mit FTP zu arbeiten, reicht es aus, QNetworkAccessManager zu verwenden, mit dem wir bereits bei der Implementierung Herunterladen einer Datei von der Website gearbeitet haben. .
Lassen Sie uns ein kleines Programm schreiben, das eine beliebige Datei auf den Server hochlädt, die wir auf unserem PC über den Dateiauswahldialog auswählen. Der Fortschritt beim Hochladen der Datei auf den FTP-Server wird ebenfalls angezeigt.
Dazu wird im Anwendungsfenster eine Schaltfläche zum Öffnen des Dateiauswahldialogs angezeigt. QLineEdit, das den Pfad zur Datei anzeigt. QLineEdit, in dem wir die Adresse eingeben, an der die Datei geladen wird. Die Schaltfläche zum Starten des Downloads sowie der Fortschrittsbalken, der den Fortschritt des Datei-Uploads auf den Server anzeigt.
Projektstruktur
- UploadFile.pro - Projektprofil.
- main.cpp - Hauptfunktionsdatei.
- widget.h - Header-Datei des Anwendungsfensters.
- widget.cpp - Anwendungsfenster-Implementierungsdatei.
- widget.ui - Anwendungsfenster-Formulardatei.
Das Netzwerkmodul muss dem Projektprofil hinzugefügt werden, um mit QNetworkAccessManger zu arbeiten.
QT += network
Die Datei main.cpp wird standardmäßig erstellt und nicht geändert. Im Grafikdesigner wird ein Fensterformular erstellt, das am Anfang des Artikels gezeigt wurde.
Widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QString> #include <QFile> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void on_selectFileButton_clicked(); // Слот для вызова диалога выбора файла void on_uploadButton_clicked(); // Слот для запуска загрузки void uploadFinished(QNetworkReply *reply); // Слот окончания загрузки void uploadProgress(qint64 bytesSent, qint64 bytesTotal); // Слот прогресса загрузки private: Ui::Widget *ui; QNetworkAccessManager *m_manager; QString m_fileName; // Файл обязательно необходимо сохранять в куче // Если создавать объект файла в стеке, то программа будет крашиться. QFile *m_file; }; #endif // WIDGET_H
Widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QFileDialog> #include <QUrl> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); m_manager = new QNetworkAccessManager(this); connect(m_manager, &QNetworkAccessManager::finished, this, &Widget::uploadFinished); } Widget::~Widget() { delete ui; } void Widget::on_selectFileButton_clicked() { m_fileName = QFileDialog::getOpenFileName(this, "Get Any File"); ui->fileNameLineEdit->setText(m_fileName); } void Widget::on_uploadButton_clicked() { // Создаём объект файла при запуске загрузки m_file = new QFile(m_fileName); // Далее требуется информация об имени файла // Путь загрузки на сервер должен выглядеть следующим образом // ftp://example.com/path/to/file/filename.txt // То есть указываем протокол -> ftp // Сервер -> example.com // Путь, где будет располагаться файла -> path/to/file/ // И имя самого файла, который берём из QFileInfo -> filename.txt QFileInfo fileInfo(*m_file); QUrl url(ui->uploadUrlLineEdit->text() + fileInfo.fileName()); url.setUserName("login"); // Устанавливаем login url.setPassword("password"); // Устанавливаем пароль url.setPort(21); // Порт протокола, по которому будем работать if (m_file->open(QIODevice::ReadOnly)) { // Запускаем загрузку QNetworkReply *reply = m_manager->put(QNetworkRequest(url), m_file); // и коннектимся к сигналу прогресса загрузки connect(reply, &QNetworkReply::uploadProgress, this, &Widget::uploadProgress); } } void Widget::uploadFinished(QNetworkReply *reply) { // Если загрузка прошла без ошибок if (!reply->error()) { // то закрываем файл m_file->close(); m_file->deleteLater(); // Удаляем объект файла reply->deleteLater(); // Удаляем объект ответа } } void Widget::uploadProgress(qint64 bytesSent, qint64 bytesTotal) { // отображаем прогресс загрузки ui->progressBar->setValue(100 * bytesSent/bytesTotal); }
Insgesamt
Als Ergebnis wird es möglich sein, die ausgewählte Datei auf den FTP-Server hochzuladen (obwohl es natürlich Meldungen im Netzwerk in den Foren gibt, dass nicht alle FTP-Server gut funktionieren, aber das sind bereits Nuancen).
Ich stelle auch fest, dass es in diesem Programm nur wenige Überprüfungen und Validierungen gibt, geben Sie also den Pfad zum Server so ein, dass die Zeile mit einem Schrägstrich abgeschlossen wird. Zum Beispiel:
ftp://example.com/path/to/file/