- 1. Жоба құрылымы
- 2. виджет.h
- 3. widget.cpp
- 4. Барлығы
Qt 5 жүйесінде желіге қосылу Network модулін пайдаланады және байланыс үшін өз протоколыңызды жасамайынша, желі арқылы байланысу үшін QNetworkAccessManager сыныбын белсенді пайдалана аласыз. Бірақ FTP -мен жұмыс істеу үшін сайттан файлды жүктеу іске асыру кезінде біз бұрыннан жұмыс істеген QNetworkAccessManager пайдалану жеткілікті. .
Серверге ерікті файлды жүктеп салатын шағын бағдарламаны жазайық, оны компьютерде файлды таңдау диалогтық терезесі арқылы таңдаймыз. Файлды FTP серверіне жүктеп салу барысы да көрсетіледі.
Ол үшін қолданба терезесінде файлды таңдау диалогтық терезесін ашу түймесі болады. QLineEdit, ол файлға жолды көрсетеді. QLineEdit, онда біз файл жүктелетін мекенжайды енгіземіз. Жүктеп алуды бастау түймесі, сонымен қатар серверге файлды жүктеп салу барысын көрсететін орындалу жолағы.
Жоба құрылымы
- UploadFile.pro - жоба профилі.
- main.cpp - негізгі функция файлы.
- widget.h - қолданба терезесінің тақырып файлы.
- widget.cpp - қолданба терезесін іске асыру файлы.
- widget.ui - қолданба терезесінің пішін файлы.
QNetworkAccessManger бағдарламасымен жұмыс істеу үшін желілік модуль жоба профиліне қосылуы керек.
QT += network
main.cpp файлы әдепкі бойынша жасалады және өзгертілмейді. Графикалық дизайнерде мақаланың басында көрсетілген терезе пішіні жасалады.
виджет.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); }
Барлығы
Нәтижесінде таңдалған файлды FTP серверіне жүктеп салу мүмкін болады (бірақ, әрине, форумдарда желіде барлық FTP серверлері жақсы жұмыс істемейтіні туралы хабарламалар бар, бірақ бұл қазірдің өзінде нюанстар).
Сондай-ақ, бұл бағдарламада тексерулер мен тексерулер аз екенін ескеремін, сондықтан желі қиғаш сызықпен жабылатын етіп серверге жолды енгізіңіз. Мысалы:
ftp://example.com/path/to/file/