一、需求:
1.简单的配置ftp参数界面
2.tcp 客户端端,接收服务器下发的参数信息
3.用户上传操作界面
在这里插入代码片
二、源码`#-------------------------------------------------

#-------------------------------------------------
#
# Project created by QtCreator 2021-06-24T15:49:34
#
#-------------------------------------------------QT       += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = FtpFileShareTool
TEMPLATE = appSOURCES += main.cpp\FtpFileTool.cpp \DialogFTPSetting.cppHEADERS  += FtpFileTool.h \DialogFTPSetting.hFORMS    += FtpFileTool.ui \DialogFTPSetting.ui
// 主操作界面
#ifndef FTPFILETOOL_H
#define FTPFILETOOL_H#include <QWidget>
#include <QString>
#include <QUrl>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include "DialogFTPSetting.h"namespace Ui {class FtpFileTool;
}class FtpFileTool : public QWidget
{Q_OBJECTpublic:explicit FtpFileTool(QWidget *parent = 0);~FtpFileTool();// 上传文件void put(const QString &fileName, const QString &path);private slots:void slot_put();void slot_applyNewConfig();void slot_uploadProgress(qint64 bytesSent, qint64 bytesTotal);   // 更新上传进度void slot_error(QNetworkReply::NetworkError code);void slot_replyFinished(QNetworkReply*);private:Ui::FtpFileTool *ui;DialogFTPSetting m_dlgFtpSetting;QUrl m_pUrl;        // 远程 ftp url 地址QFile m_file;QNetworkAccessManager *m_manager;QNetworkReply *m_pReply;QFile *m_pFile;
};#endif // FTPFILETOOL_H
#include "FtpFileTool.h"
#include "ui_FtpFileTool.h"
#include <QMessageBox>FtpFileTool::FtpFileTool(QWidget *parent) :QWidget(parent),ui(new Ui::FtpFileTool)
{ui->setupUi(this);connect(ui->pushButtonFTPSetting, &QPushButton::clicked, &m_dlgFtpSetting, &DialogFTPSetting::exec);m_pUrl.setScheme("ftp");m_manager = new QNetworkAccessManager(this);connect(&m_dlgFtpSetting, &DialogFTPSetting::sig_ftpConfigChanged, this, &FtpFileTool::slot_applyNewConfig);connect(ui->pushButtonPut, &QPushButton::clicked, this, &FtpFileTool::slot_put);connect(ui->lineEditRemotePath, &QLineEdit::textChanged, &m_dlgFtpSetting, &DialogFTPSetting::slot_setNewRemoteConfig);connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_replyFinished(QNetworkReply*)));
}FtpFileTool::~FtpFileTool()
{delete ui;
}void FtpFileTool::slot_put()
{m_pFile = new QFile(ui->lineEditLocalPath->text());qDebug() <<"src file : "<< ui->lineEditLocalPath->text().toLatin1();if(false == m_pFile->open(QIODevice::ReadOnly)){QMessageBox messageBox(this);messageBox.setWindowTitle("erro");messageBox.setText("open file error");messageBox.exec();}else{QByteArray data = m_pFile->readAll();m_pUrl.setPath(ui->lineEditRemotePath->text());m_manager->setNetworkAccessible(QNetworkAccessManager::Accessible);m_pReply = m_manager->put(QNetworkRequest(m_pUrl), data);qDebug() << "文件内容:" << data;connect(m_pReply, &QNetworkReply::uploadProgress, this, &FtpFileTool::slot_uploadProgress);connect(m_pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slot_error(QNetworkReply::NetworkError)));if (m_pReply->error() != QNetworkReply::NoError){qDebug() << "Error: " << m_pReply->errorString();}m_pFile->close();}
}void FtpFileTool::slot_applyNewConfig()
{    m_pUrl.setHost(m_dlgFtpSetting.getRemoteIP());m_pUrl.setPort(21);m_pUrl.setUserName(m_dlgFtpSetting.getUserName());m_pUrl.setPassword(m_dlgFtpSetting.getPassword());if (m_dlgFtpSetting.getRemotePathSetting()!= "" ){m_pUrl.setPath(m_dlgFtpSetting.getRemotePathSetting().toLatin1());qDebug() <<"ftp 文件设置 " <<m_dlgFtpSetting.getRemotePathSetting().toLatin1();ui->lineEditRemotePath->setText(m_dlgFtpSetting.getRemotePathSetting());}qDebug() <<  m_pUrl.host() << m_pUrl.port() << m_pUrl.userName() << m_pUrl.password();//检测URL地址是否合法if (!m_pUrl.isValid()){QMessageBox::critical(NULL, tr("Error"), "URL地址不合法!" );}else if (m_pUrl.scheme() != "ftp"){QMessageBox::critical(NULL, tr("Error"), "URL地址必须以ftp开头!");}
}// 更新上传进度
void FtpFileTool::slot_uploadProgress(qint64 bytesSent, qint64 bytesTotal)
{ui->progressBarUpload->setMaximum(bytesTotal);ui->progressBarUpload->setValue(bytesSent);
}void FtpFileTool::slot_error(QNetworkReply::NetworkError code)
{QMessageBox messageBox(this);messageBox.setWindowTitle("erro");messageBox.setText("upload error, "+QString::number(code).toLatin1());messageBox.exec();
}// 删除指针,更新和关闭文件
void FtpFileTool::slot_replyFinished(QNetworkReply*)
{if (m_pReply->error() == QNetworkReply::NoError){m_pReply->deleteLater();m_pFile->flush();m_pFile->close();}else{QMessageBox::critical(NULL, tr("Error"), "错误!!!");}
}
// 参数配置界面和参数接收
#ifndef DIALOGFTPSETTING_H
#define DIALOGFTPSETTING_H#include <QDialog>
#include <QTcpSocket>namespace Ui {class DialogFTPSetting;
}class DialogFTPSetting : public QDialog
{Q_OBJECTpublic:explicit DialogFTPSetting(QWidget *parent = 0);~DialogFTPSetting();QString getRemotePathSetting();QString getRemoteIP();QString getRemotePort();QString getUserName();QString getPassword();public slots:void slot_setNewRemoteConfig(const QString strPath);signals:void sig_ftpConfigChanged();    // 参数配置改变的时候发出信号private slots:void slot_getRemoteConfig();    // 接受远程参数配置数据void slot_connectOrDisconnect();   // 确认参数,并建立链接, 接受远程参数设置void slot_updateAsDisconnected();   // 被动断开界面刷新void slot_sureConfig();private:Ui::DialogFTPSetting *ui;QTcpSocket m_clientSocket;
};#endif // DIALOGFTPSETTING_H```cpp
#include "DialogFTPSetting.h"
#include "ui_DialogFTPSetting.h"
#include <QHostAddress>
DialogFTPSetting::DialogFTPSetting(QWidget *parent) :QDialog(parent),ui(new Ui::DialogFTPSetting)
{ui->setupUi(this);connect(ui->pushButtonConnect, &QPushButton::clicked, this, &DialogFTPSetting::slot_connectOrDisconnect);connect(&m_clientSocket, &QTcpSocket::disconnected, this, &DialogFTPSetting::slot_updateAsDisconnected);connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &DialogFTPSetting::slot_sureConfig);
}DialogFTPSetting::~DialogFTPSetting()
{delete ui;
}QString DialogFTPSetting::getRemotePathSetting()
{return ui->lineEdit_RecvMsg->text().toLatin1();
}QString DialogFTPSetting::getRemoteIP()
{return ui->lineEditIP->text();
}QString DialogFTPSetting::getRemotePort()
{return ui->lineEditPort->text();
}QString DialogFTPSetting::getUserName()
{return ui->lineEditUserName->text();
}QString DialogFTPSetting::getPassword()
{return ui->lineEditPassword->text();
}void DialogFTPSetting::slot_getRemoteConfig()
{QByteArray recvByts = m_clientSocket.readAll();QString strRecv = QString(recvByts);ui->lineEdit_RecvMsg->setText(strRecv.toLatin1());//    m_remoteConfig = strRecv.toLatin1();
}void DialogFTPSetting::slot_setNewRemoteConfig(const QString strPath)
{ui->lineEdit_RecvMsg->setText(strPath);
}void DialogFTPSetting::slot_connectOrDisconnect()
{if(ui->pushButtonConnect->text() == tr("断开")){m_clientSocket.disconnectFromHost();ui->lineEditIP->setEnabled(true);ui->lineEditPassword->setEnabled(true);ui->lineEditPort->setEnabled(true);ui->lineEditUserName->setEnabled(true);ui->pushButtonConnect->setText("连接");}else{quint16 port = ui->lineEditPort->text().toUInt();QHostAddress ip(ui->lineEditIP->text());m_clientSocket.connectToHost(ip, port);// 监听接受配置connect(&m_clientSocket, &QIODevice::readyRead, this, &DialogFTPSetting::slot_getRemoteConfig);if(m_clientSocket.isOpen()){ui->lineEditIP->setEnabled(false);ui->lineEditPassword->setEnabled(false);ui->lineEditPort->setEnabled(false);ui->lineEditUserName->setEnabled(false);ui->pushButtonConnect->setText("断开");}}
}void DialogFTPSetting::slot_updateAsDisconnected()
{ui->lineEditIP->setEnabled(true);ui->lineEditPassword->setEnabled(true);ui->lineEditPort->setEnabled(true);ui->lineEditUserName->setEnabled(true);ui->pushButtonConnect->setText("连接");
}void DialogFTPSetting::slot_sureConfig()
{emit sig_ftpConfigChanged();
}

三、坑
1.远程路径, 使用QUrl 的setPath() 函数来设定远程文件时候,文件路径不包含ftp://ip// , 这个部分应该是在 设置ftp ip 时候已经默认了,用户在setpath 只要告诉 下图 path 这部分,否则会有 网络错误码201

Qt ftp 文件上传工具开发相关推荐

  1. FTP文件上传工具类

    import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.a ...

  2. 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录

    将文件上传至ftp服务器,传入File对象,将文件上传至ftp服务器 需要配置修改的点: 1. 服务器ip端口(服务器ip 端口22/21). 2. 服务器账号密码(服务器登录用户名密码). 3. 上 ...

  3. 基于OkHttp 、Retrofit 、Volley 、RxJava、Novate多种网络框架整合的快速项目开发框架,一行代码实现Ftp文件上传、文件下载、文件删除和进度监听的工具类的使用

    基于OkHttp .Retrofit .Volley .RxJava.Novate多种网络框架整合的快速项目开发框架,Ftp文件上传.文件下载的工具类的使用. 依赖于Ftp的jar包,对上传.下载.删 ...

  4. php vsftpd文件上传类,php ftp文件上传函数(基础版)

    php ftp文件上传函数(基础版) 复制代码 代码如下: // 定义变量 $local_file = 'local.zip'; $server_file = 'server.zip'; // 连接F ...

  5. 十个非常好用的文件上传工具(插件)

    概述:下面列举了十个非常好用的文件上传工具,它们有些是针对jQuery的插件,有些是Ajax文件上传插件,还有支持多文件和大文件的批量上传工具. 根据维基百科的定义,文件上传是将本地的数据传送到远程系 ...

  6. ftp服务器上传工具,3款服务器上传工具好用推荐

    对于ftp服务器上传工具,你了解多少?其实一般人也接触不到这种软件.服务器上传工具主要是针对从事网站管理的工作人员比较有利的一款工具.可以帮助他们快速的解决工作中的问题.方便.简单.快捷又明了的解决问 ...

  7. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  8. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  9. 阿里云文件上传工具类

    文件实体类 @Data public class UploadFile {private String fileName;private String fileType;private long fi ...

最新文章

  1. 未定义标识符 stringc/c++(20)_20款奔驰G63AMG霸气颜值 运动造型
  2. homebrew可以管理众多开源软件的安装和卸载
  3. oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...
  4. 密码可见_教你如何批量删除微博、设置仅自己可见、仅好友可见等
  5. 信安教程第二版-第12章网络安全审计技术原理与应用
  6. Vsftp在Ubuntu的安装与配置
  7. DevExpress.XtraGrid 导出文本的bug
  8. linux定时器时间间隔为0,linux下定时器的使用--timer_create等系列
  9. 利用Jsoup解析HTML
  10. django复习笔记2:models
  11. 【算法】排序_汇总篇
  12. java 定时器 的中断程序,AVR单片机教程——定时器中断
  13. excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
  14. 雷库兹韦尔量子计算机,人物 | 他说,再挺11年,送你长生不老,要不要?
  15. MATLAB图像数字水印的方案
  16. 数据建模 --- 概念建模+逻辑建模+物理建模
  17. 【FreeRTOS】队列的使用
  18. Python 环境安装系统教程——PyCharm
  19. C语言上学期整理(第3章)
  20. 美版头条BuzzFeed两天股价涨3倍:因采用ChatGPT上岗写稿

热门文章

  1. mysql大数据优化要注意的细节
  2. 使用直线标定板进行相机畸变校正,并且进行9点标定(halcon)
  3. 计算机应用基础18春在线作业1答案,东师计算机应用基础-18春在线作业1.docx
  4. vue上传文件php,php文件上传 – 前端开发,JQUERY特效,全栈开发,vue开发
  5. java消息顺序执行_Apache Flink:如何并行执行但保持消息顺序?
  6. java实现poi导入excel_Java POI实现将导入Excel文件的示例代码
  7. c#数据库訪问返回值类型为SqlDataReader时使用using时注意的问题
  8. 3ds Max 2018 在安装后无法启动或出现不稳定
  9. 4步win7下简单FTP服务器搭建(试验成功)
  10. java设计模式之单例模式(七种方法)