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