一、简述

本文基于QT5.8使用QNetworkAccessManager类进行利用FTP协议的上传和下载操作,Qt4中使用的QFtp模块在QT5后被移除,如果有需要可以去GitHub上下载编译后使用(官方地址:https://github.com/qt/qtftp),使用QFtp和QUrlInfo可以实现获得服务器端的文件路径,结合TreeWidget实现目录预览。现在官方推荐使用的是QNetworkAccessManager类,在使用QNetworkAccessManager类之前,请先保证自己的QT版本为QT5.X

我使用的服务器端是在Linux下配置的FTP服务器,客户端的QT代码是在Windows上编译运行的,FTP的服务器配置可以在我的另一篇博客中查看(https://blog.csdn.net/Sakuya__/article/details/86597994)。

本文代码下载:

CSDN下载

GitHub下载

百度云下载地址    提取码:wnnn


二、界面展示

输入FTP服务器地址,用户名和密码,我的Linux服务器IP地址为192.168.43.129,用户名为sakuya,密码为abcd1234。

点击上传按钮选择文件上传

上传成功后


三、代码

一、为了使用关于网络的类,首先,在Pro文件中加入一行

QT      += network

二、头文件mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QMessageBox>
#include <QFileDialog>
#include <QMetaEnum>
#include <QUrl>
#include <QFile>
#include <QDir>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();public slots:bool initFTP();void replyFinished(QNetworkReply*);void loadProgress(qint64 bytesSent, qint64 bytesTotal);QString getFileName(QString m_filePath);void readContent();void replyError(QNetworkReply::NetworkError error);private slots:void on_Btn_upload_clicked();void on_Btn_download_clicked();private:Ui::MainWindow *ui;QNetworkAccessManager *accessManager;QString ftpPath;QString user;QString password;QFile *file;QNetworkReply *reply;
};#endif // MAINWINDOW_H

三、mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置进度条ui->progressBar->setValue(0);ui->progressBar->setAlignment(Qt::AlignRight | Qt::AlignVCenter); // 对齐方式ui->progressBar->setFormat(QString::fromUtf8("当前无任务:%1%").arg(QString::number(0, 'f', 1)));
}MainWindow::~MainWindow()
{delete ui;
}// 初始化记录URL地址,用户名,密码,并检测URL地址的合法性
bool MainWindow::initFTP()
{// 判断有没有填写URL地址和用户名、密码if (ui->lineEdit_ftp->text().isEmpty()) {QMessageBox::critical(NULL, tr("Error"), "URL地址不能为空");return false;}else if (ui->lineEdit_user->text().isEmpty()) {QMessageBox::critical(NULL, tr("Error"), "user不能为空");return false;}else if (ui->lineEdit_user->text().isEmpty()) {QMessageBox::critical(NULL, tr("Error"), "密码不能为空");return false;}else {ftpPath = ui->lineEdit_ftp->text();user = ui->lineEdit_user->text();password = ui->lineEdit_password->text();// 检测URL地址是否合法QUrl url = QUrl(ftpPath);if (!url.isValid()) {QMessageBox::critical(NULL, tr("Error"), "URL地址不合法!");return false;}else if (url.scheme() != "ftp") {QMessageBox::critical(NULL, tr("Error"), "URL地址必须以ftp开头!");return false;}return true;}
}// 删除指针,更新和关闭文件
void MainWindow::replyFinished(QNetworkReply*)
{if (reply->error() == QNetworkReply::NoError) {reply->deleteLater();file->flush();file->close();}else {QMessageBox::critical(NULL, tr("Error"), "错误!!!");}
}// 更新进度条
void MainWindow::loadProgress(qint64 bytesSent, qint64 bytesTotal)
{ui->progressBar->setValue(0);qDebug() << "loaded" << bytesSent << "of" << bytesTotal;ui->progressBar->setMaximum(bytesTotal); //最大值ui->progressBar->setValue(bytesSent);  //当前值double currentProgress = (bytesSent - ui->progressBar->minimum()) * 100.0 / (bytesTotal - ui->progressBar->minimum());ui->progressBar->setFormat(QString::fromUtf8("当前进度为:%1%").arg(QString::number(currentProgress, 'f', 1)));
}// 获得传入路径的文件名
QString MainWindow::getFileName(QString m_filePath)
{QString temp;QString fileName;int count = -1;fileName = m_filePath;for(int i = 0; temp != "/"; i++){temp = fileName.right(1);fileName.chop(1);count++;}fileName = m_filePath.right(count);return fileName;
}// 下载过程出错,进行报错处理(超时处理也是丢出超时信号,交由此槽函数进行处理)
void MainWindow::replyError(QNetworkReply::NetworkError error)
{auto metaEnum = QMetaEnum::fromType<QNetworkReply::NetworkError>();// 枚举值转换为字符串auto errStr = metaEnum.valueToKey(error);QMessageBox::critical(NULL, tr("Error"), QString(errStr));file->deleteLater();file = Q_NULLPTR;reply->deleteLater();
}// 下载时向本地文件中写入数据
void MainWindow::readContent()
{file->write(reply->readAll());
}// 上传文件
void MainWindow::on_Btn_upload_clicked()
{if (initFTP()) {// 得到选择的文件的路径,保存在字符串链表中QStringList string_list;string_list = QFileDialog::getOpenFileNames(this, tr("选择文件"), "", tr("Files (*)"));if (!string_list.isEmpty()) {for (int i = 0; i < string_list.count(); i++) {QString filePath;filePath = string_list.at(i);file = new QFile(filePath);file->open(QIODevice::ReadOnly);QByteArray byte_file = file->readAll();QString fileName;fileName = getFileName(filePath);QString m_ftpPath;m_ftpPath = ftpPath + "/" + fileName;// 把选中的文件上传到服务器accessManager = new QNetworkAccessManager(this);accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);QUrl url(m_ftpPath);url.setPort(21);url.setUserName(user);url.setPassword(password);QNetworkRequest request(url);reply = accessManager->put(request, byte_file);connect(accessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));connect(reply, SIGNAL(uploadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),SLOT(replyError(QNetworkReply::NetworkError)));}}}
}// 下载文件
void MainWindow::on_Btn_download_clicked()
{if (initFTP()) {QString folderPath;folderPath = QFileDialog::getExistingDirectory(this, tr("选择文件"), "", QFileDialog::ShowDirsOnly);file = new QFile(folderPath + "/test.jpg");file->open(QIODevice::WriteOnly);// 从服务器上下载文件到选中文件夹QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);QUrl url("ftp://192.168.43.129/software/timg.jpeg");url.setPort(21);url.setUserName("jinxiaodan");url.setPassword("abcd1234");QNetworkRequest request(url);reply = accessManager->get(request);connect((QObject *)reply, SIGNAL(readyRead()), this, SLOT(readContent()));connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));connect(reply, SIGNAL(downloadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),SLOT(replyError(QNetworkReply::NetworkError)));}
}

以上则为全部代码,自己新建项目,把代码复制进去,按照开始展示的界面设置UI界面,把代码中的登录服务器地址、用户名和密码改为你自己的即可。


四、缺点

下载过程中文件写入是在主线程中进行的,如果文件过大,频繁写入会造成主线程卡顿现象。要避免此种情况,请在工作线程中进行。

另外,如果想要实现目录预览功能请使用QFtp和QUrlInfo,可以看到服务器端的文件目录,选择文件要下载的文件,QNetworkAccessManager只能更改源代码选择自己想要下载的文件。

QT 实现FTP客户端相关推荐

  1. Qt4_写FTP客户端

    写FTP客户端 QFtp类在Qt中实现了FTP协议的客户端程序,它提供了非常多的函数来执行多数常见的FTP操作,同时还可以执行任意的FTP指令. QFtp类是异步工作的.若调用一个像get()或者pu ...

  2. linux 影院 ftp客户端20端口号,Linux下的ftp客户端说明文档

    Linux下的ftp客户端说明文档 发布时间:2006-09-24 00:20:41来源:红联作者:userhq l 软件功能: 本程序基于linux下的socket函数,利用ftp 协议,实现lin ...

  3. C/C++、Qt4实现FTP客户端(有无界面版)

    简介 操作系统:Ubuntu 12.04 LTS 开发工具:GNU4.6.3,C/C++标准库,Qt4,Qt Creator Documentation 2.4.1 代码下载:码云:传送门,GitHu ...

  4. Qt之FTP上传/下载文件操作

    一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&qu ...

  5. 网络编程--ftp客户端的实现(c#版)

    .net2.0对ftp有了一个很好的封装,但是确容易让人忽略ftp的真正内部实现,下面是我实现的ftp客户端的功能,其主要步骤是这样的: 1.创建一个FtpWebRequest对象,指向ftp服务器的 ...

  6. 安装ftp连接linux服务器配置,Linux下FTP安装及配置(VSFTPD服务器安装配置、FTP客户端安装配置)...

    安装说明 安装环境:CentOS-6.3 安装方式:yum安装.rpm源码安装 软件:ftp-0.17-51.1.el6.x86_64.rpm 下载地址:http://pan.baidu.com/s/ ...

  7. ftp 客户端 上传

    ps: 1.使用netkit-ftp-0.17交叉编译出来的ftp客户端, 2.然后写上传代码,调用ftp传服务器: 3.最好使用bin二进制文件形式传输: 4.ftp客户端和Ubuntu自带的ftp ...

  8. 18. 编写FTP客户端程序

    在实际应用中可能经常访问FTP服务器来上传或下载文件,Python也可以替我们做这些. [示例 1]下面请看一个例子(ftpclient). 运行的结果如下: FTP客户端程序的编写还可以参照官方文档 ...

  9. windows ftp服务器_ftp客户端软件,推荐6个流行的FTP客户端软件

    无论你是做网站工作,还是运行一个家庭FTP服务器,或者你只是喜欢高速下载,一个稳定且功能齐全的FTP客户端工具都可以节省你大量时间和生命,现在有大量的免费或者收费的FTP客户端软件供大家选择,这里总结 ...

最新文章

  1. cvAdd()和 cvAddS()函数的使用
  2. 点击按钮弹出iframe_WEB安全(四) :CSRF与点击劫持
  3. hertz接触理论_角接触轴承的组配和预紧技术及影响
  4. Android-01:扫描SD卡以.xxx结尾的文件
  5. 计算机科学与技术python方向_专业解读丨计算机科学与技术
  6. 量化人的海市蜃楼:被统计谬误支配的世界
  7. FireReport 层次坐标 使用问题A1[A1:-1]=A1
  8. CS5532 C51驱动程序
  9. 苹果手机与苹果tv连接服务器无响应,屏幕镜像正在查找Apple Tv,隔空播放无法连接?...
  10. 迅雷总提示版权什么的。。
  11. Gabor变换(2)
  12. 云计算中心和超算中心有何区别?
  13. 新款奔驰S400L改装原厂360全景影像系统,不在担心走向问题
  14. 华为RH2288做raid方法
  15. 元宇宙营业厅,数字技术融合,赋能实体经济
  16. 电力,地铁,医生等行业值班员全能倒班日历助手
  17. 信捷plc485通信上位机_三菱FX3U编程口通信上位机QT实现
  18. 蓝桥杯python 基础练习3 字母图形
  19. 【天光学术】古代文学论文该怎么写?为你步步解说!
  20. SharePoint 2010 网站备份还原简单介绍

热门文章

  1. IDEA SQL 红色字体报错
  2. Windows下Nginx的常用命令
  3. 社交聊天APP被攻击怎么办?
  4. 《MLB美职棒大联盟》:棒球特殊奖项·棒球1号位
  5. 数据结构_一元多项式的建立及其运算
  6. 五一户外运动需要准备哪些装备、值得入手的运动装备推荐
  7. 包你笑,笑话之一 300w是买宾利呢还是买法拉利?
  8. 服务器卡顿怎么办?如何处理
  9. 专业婚纱拍摄时尚主题网站搭建模板
  10. 六月二十八英雄联盟服务器维修,LOL6月28日更新公告内容汇总 英雄联盟6.28更新大全...