Evgenij LegotskojJune 6, 2017, 12:48 p.m.

Qt/C++ - Tutorial 066. Uploading files to an FTP server

To work with the network in Qt 5 , the Network module is used, and for data transmission over the network, you can actively use the QNetworkAccessManager class if you do not create your own protocol for data transfer. But for working with FTP it is enough to use QNetworkAccessManager , with which we already worked when downloading a file from the site .

We will write a small program that will upload an arbitrary file to the server, which we will select on our PC using the file selection dialog. Also, the progress of the file upload to the FTP server will be shown.

To do this, there will be a button in the application window to open the file selection dialog. QLineEdit, in which the path to the file will be displayed. QLineEdit, in which we will enter the address where the file will be downloaded. A startup boot button, and a progress bar that will show the progress of the file upload to the server.

Project structure

  • UploadFile.pro - Project profile.
  • main.cpp - File of the main function.
  • widget.h - Application window header file.
  • widget.cpp - Application window implementation file.
  • widget.ui - Application window form file.

In the project profile, you need to add a network module to work with QNetworkAccessManger.

QT       += network

The main.cpp file is created by default and is not affected by the change. The graphic designer will create a window form, which was shown at the beginning of the article.

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();         // Slot for calling the file selection dialog
    void on_uploadButton_clicked();             // Upload slot
    void uploadFinished(QNetworkReply *reply);  // Upload finish slot
    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);  // Upload progress slot

private:
    Ui::Widget *ui;
    QNetworkAccessManager *m_manager;
    QString m_fileName;
    // You must save the file on the heap
    // If you create a file object on the stack, the program will crash.
    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);

    // Next, you need information about the file name
    // The upload path to the server should look like this
    // ftp://example.com/path/to/file/filename.txt
    // That is, we specify the protocol -> ftp
    // Server -> example.com
    // The path where the file will be located -> path/to/file/
    // And the name of the file itself, which we take from QFileInfo -> filename.txt
    QFileInfo fileInfo(*m_file);
    QUrl url(ui->uploadUrlLineEdit->text() + fileInfo.fileName());
    url.setUserName("login");    // Set login
    url.setPassword("password"); // Set пароль
    url.setPort(21);             // Protocol port, which we will work on

    if (m_file->open(QIODevice::ReadOnly))
    {
        // Start upload
        QNetworkReply *reply = m_manager->put(QNetworkRequest(url), m_file);
        // And connect to the progress upload signal
        connect(reply, &QNetworkReply::uploadProgress, this, &Widget::uploadProgress);
    }

}

void Widget::uploadFinished(QNetworkReply *reply)
{
    // If the upload was successful without errors
    if (!reply->error())
    {
        // то закрываем файл
        m_file->close();
        m_file->deleteLater();  // delete object of file
        reply->deleteLater();   // delete object of reply
    }
}

void Widget::uploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
    // Display the progress of the upload
    ui->progressBar->setValue(100 * bytesSent/bytesTotal);
}

Result

As a result, you will be able to download the selected file to the FTP server (although of course in the network on the forums and there are reports that not all FTP-servers work well, but these are nuances).

Also note that this program has few checks and validations, so enter the path to the server so that the line was closed by the slash. For example:

ftp://example.com/path/to/file/

Download project

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
KA

C++ - Тест 003. Условия и циклы

  • Result:78points,
  • Rating points2
R

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
R

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
Last comments
V

Django - Tutorial 027. Implementation Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Now discuss on the forum

Как в Qt сохранить файл в папку загрузок в Android

Вызывайте эту функцию или в самом начале, или когда нужно сохранять файлы. Она дает права доступа для записи.

QML+QtGraphicalEffects

да, сборку делал без параметра поиска qml, хотя dll QtGraphicalEffects он подтягивает, когда я добавил всю папку QtGraphicalEffects в проект - то заработало, похоже что именно qml-файлов ему не …

Не работают слоты/сигналы

и посмотрите работу с потоками в Qt, там подробно описано как передавать данные с одного в потока в другой при помощи сигналов и слотов

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB