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 хостинг.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

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

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

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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