Загрузка QT FTP на сервер с учетными данными - PullRequest
0 голосов
/ 01 июля 2019

Я создал приложение, которое загружает данные из Open API и компилирует их в отформатированный файл .XLSX.Затем мне нужно загрузить этот файл на локальный FTP-сервер, используя имя пользователя и пароль.Я пытаюсь использовать пример с открытым исходным кодом для загрузки на FTP, он отлично работает.Тем не менее, при переносе частей этого в мое собственное приложение, это не удается.Что я могу сделать, чтобы успешно передавать данные по FTP?Ниже приведены мои сегменты кода, поскольку они практически идентичны.

Пример 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);

    QFileInfo fileInfo(*m_file);
    QUrl url(ui->uploadUrlLineEdit->text() + fileInfo.fileName());
    url.setUserName("BoardmanOH");
    url.setPassword("_4WMAe,^Mo=jYt6mYw@iz7Ri");
    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);
}

Пример заголовочного файла:

#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

Мой файл CPP:

#include "ftpuploader.h"

FTPUploader::FTPUploader(QString filename)
{
    m_fileName = filename;

    m_manager = new QNetworkAccessManager(this);
    connect(m_manager, &QNetworkAccessManager::finished, this, &FTPUploader::uploadFinished);
}

void FTPUploader::start()
{
    m_file = new QFile(m_fileName);

    QFileInfo fileInfo(*m_file);
    QUrl url("ftp://********.com/" + fileInfo.fileName());
    url.setUserName("*******");
    url.setPassword("*********");
    url.setPort(21);

    if (m_file->open(QIODevice::ReadOnly))
    {
        QNetworkReply *reply = m_manager->put(QNetworkRequest(url), m_file);
        connect(reply, &QNetworkReply::uploadProgress, this, &FTPUploader::uploadProgress);
    }
}

void FTPUploader::uploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
    qDebug() << "Uploaded: " << bytesSent << "of" << bytesTotal;
    //ui->progressBar->setValue(100 * bytesSent/bytesTotal);
}

void FTPUploader::uploadFinished(QNetworkReply *reply)
{
    if (!reply->error())
    {
        m_file->close();
        m_file->deleteLater();
        reply->deleteLater();
    }
}

Мой заголовочный файл:

#ifndef FTPUPLOADER
#define FTPUPLOADER

#include <QtCore>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>

class FTPUploader: public QObject
{
    Q_OBJECT
public:
    explicit FTPUploader(QString filename = nullptr);

    void start();

private slots:
    void uploadFinished(QNetworkReply *reply);
    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);

private:
    QNetworkAccessManager *m_manager;
    QString m_fileName;
    QFile *m_file;
};

#endif

Я считаю, что эти файлы выглядят практически одинаково, но они просто не будут работать так, как ожидалось.Спасибо за любую помощь или комментарии, которые вы можете предоставить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...