Qt ftp 文件上传工具开发

一、需求:
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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vboxmanage改动uuid报错的解决的方法

我的环境&#xff1a; Virtualbox 4.3.10 r93012 操作系统&#xff1a;win7 问题&#xff1a;Virtualbox在使用拷贝的虚拟盘时会提示uuid冲突&#xff1a; Because a hard disk with uuid ‘’ already exists. 依照网上的说法&#xff0c;执行VBoxManage改动uuid报错&#xff…

QT源码交叉编译

交叉编译QT 源码 板子&#xff1a;全志 V3S , arm32位cpu ubuntu 虚拟机搭建好交叉编译链环境&#xff0c;添加环境变量 ok3399ubuntu:~$ echo $PATH /opt/OK3399-linux-release/host/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lo…

即将从TechReady5归来

TechReady是微软内部面向Services、DPE、TS等部门的技术会议&#xff0c;每年两次&#xff0c;这次是第5次。听了几天课&#xff0c;虽说很多内容有点旧&#xff0c;但其中还是有不少好的东东&#xff0c;呵呵。 TechReady5的第2天&#xff0c;Bill Gates给了一节General Sessi…

QT 发布程序到开发板

设置 IP 与开发板同一网段 设置一个device 设置开发板平台的 kit , 选择 device 设备为刚刚设置好的 pro 文件加入代码设置远程发布安装路径 INSTALLS target target.path /root/home/ftp5. 重新qmake工程完成设置 6. 是程序可以在板上运行&#xff0c; 之前这里一直…

Hibernate(十):n-n关联关系

背景&#xff1a;在实际开发中我们会遇到表的多对多关联&#xff0c;比如&#xff1a;一篇博客文章&#xff0c;它可以同时属于JAVA分类、Hibernate分类。 因此&#xff0c;我们在hibernate的学习文章系列中&#xff0c;需要学会如何使用hibernate来实现多对多的关联关系。 在h…

QT 开发基于高德智感 ITA SDK 的红外模组应用

QT 开发基于高德智感 ITA SDK 的红外模组应用 1.把创建的工程 .pro 文件打开&#xff0c;在文本编辑区域点击鼠标右键弹出操作选项框&#xff0c; 点击 “Add Libraray…” 2.选择“External Libraray ”, 点击 “Next” 3.在弹出框点击选择Linux Platform, Library Type 选…

webpack第一节(4)

每次修改了代码都需要重新手动打包&#xff0c;这样很麻烦&#xff0c;不符合webpack的初衷&#xff0c;我们查看webpack帮助看看有没有可以自动运行的方法 输入 webpack -help 可以发现有个 --watch方法 它的解释是监听系统文件改变 我们试一试 现在监听进程一直在运行 我们改…

T.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflectio

There is no getter for property named * in class java.lang.String&#xff0c;此错误之所以出现&#xff0c;是因为mybatis在对parameterType"String"的sql语句做了限制&#xff0c;假如你使用<when test"username ! null">这样的条件判断时&…

【新媒体】现阶段新闻聚合的玩法

郑昀 20070824<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />新浪科技主编曹增辉的《新闻聚合的门槛》论及了玩聚所处的一些大环境之先天不足&#xff0c;主要是环境门槛、细分市场的门槛&#xff0c;以及入口问题。我的理解呢…

1 java开发工具IDEA的使用

IntelliJ IDEA 2017.1汉化破解版安装图文教程(附汉化补丁) 注册码:http://idea.lanyus.com/ 点击在线生成 IntelliJ IDEA 2017.1正式版发布了&#xff0c;在新增功能方面值得关注的亮点有对Java 9的支持&#xff0c;以及对 Spring Data 支持的改进。在增强功能上&#xff0c;除…

[转]权限树中Checkbox的操作[Asp.Net2.0]

转自:http://jeffamy.cnblogs.com/archive/2006/06/17/428387.html原文如下:这里使用asp.net2.0的TreeView控件结合JavaScript实现权限树的部分功能。假设权限树中有如下三条规则&#xff1a;1、该节点可以访问&#xff0c;则他的父节点也必能访问&#xff1b;2、该节点可以访问…

java -XX:+PrintFlagsInitial该命令可以查看所有JVM参数启动的初始值

java -XX:PrintFlagsInitial 该命令可以查看所有JVM参数启动的初始值 [Global flags]intx ActiveProcessorCount -1 {product}uintx AdaptiveSizeDecrementScaleFactor 4 …

影视资料

影视资料栏目属于一把刀实用查询大全的娱乐类别。中国最大的影视资料数据库和影人明星数据库&#xff0c;囊括包括中国、中国香港、中国台湾、美国、日本、韩国、英国等全球数十个国家的电影、电视资料及相关海报、剧照。转载于:https://blog.51cto.com/65000/41062

VA Code编写html(1)

<html><head><title>my webside</title><!--win‘/’注释行--><!--防止中文乱码在head中添加如下代码--><meta charset"utf-8"><body><!--<img src"image/1.jpg" alt"未找到图片">加载…

MFC 使用 Picture control 显示图片和数据流

一、使用现有的图片文件显示在 界面 picture 控件 在MFC picture 加载bitmap 图片方法图片可以是从资源文件夹来的&#xff0c;也可以是文件路径等CBitMap 载入图像接口 有两种方式 BOOL LoadBitmap(LPCTSTR lpszResourceName); // 资源文件名 BOOL LoadBitmap(UINT nIDResour…