Evgenii Legotckoi
Evgenii LegotckoiМаусым 6, 2017, 12:48 Т.Қ.

Qt/C++ - 066-сабақ. Файлдарды FTP серверіне жүктеп салу

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/

Жобаны жүктеп алу

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 7:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 7:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
i
innorwallҚар. 14, 2024, 5:42 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwallҚар. 14, 2024, 3:09 Т.Қ.
Qt/C++ - 068-сабақ. CLion жүйесінде CMAKE құрастыру жүйесін пайдаланатын Hello World ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwallҚар. 14, 2024, 10:05 Т.Ж.
ЖАМАНДЫҚ ЯРЕК. Google reCAPTCHA пайдалану 2001; 98 29 34 priligy buy
Енді форумда талқылаңыз
i
innorwallҚар. 14, 2024, 9:39 Т.Ж.
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwallҚар. 11, 2024, 4:55 Т.Қ.
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9AnonimҚаз. 25, 2024, 3:10 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз