Qt实现FTP的上传和下载的实例代码

 更新时间:2020年4月25日 17:30  点击:1903

为了方便网络编程,Qt 提供了 Network 模块。该模块包含了许多类,本文介绍了Qt实现FTP的上传和下载,分享给大家

本来想简单抄抄书,随便手写个Ftp客户端的,结果发现教材上的是基于Qt4的QFtp类库,而在Qt5中取消了这一个类库(同时也取消了QHttp等的类),取而代之的是QNetworkAccessManager 这个类,把这些杂货全都揽下来了,据说是因为之前的两个类有重复而且效率有问题balabala。于是就百度了一下,发现百度上要么讲的不全,要么就是要去下一个由热心网民重新封装的QFtp类。显然我并不喜欢无脑复制粘贴,想好好看下Qt官方提供的东西的用法,深入的理解下Qt网络编程,于是就果断自行google(话说google真好用),加上查看帮助文档,终于把一个简版的Ftp客户端大概框架弄清楚了。

不多说,上源码:

Dialog.pro 

#-------------------------------------------------
#
# Project created by QtCreator 2015-10-29T23:52:56
#
#-------------------------------------------------
QT += core gui
QT += network #这里要添加这个库
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QFtp
TEMPLATE = app
SOURCES += main.cpp
 dialog.cpp
HEADERS += dialog.h

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
//注意需要添加的头文件
#include<QDialog>
#include<QPushButton>
#include<QFile>
#include<QNetworkReply>
#include<QLineEdit>
#include<QtNetwork/QNetworkAccessManager>
#include<QtNetwork/QNetworkRequest>
#include<QLabel>
#include<QString>
#include<QGridLayout>
#include<QMessageBox>
class Dialog : public QDialog
{
 Q_OBJECT
public:
 Dialog(QWidget *parent = 0);
 ~Dialog();
public:
 QGridLayout *layout;
 QLabel *LbServer,*LbUser,*LbPasswd;
 QLineEdit *LeServer,*LeUser,*LePasswd;
 QPushButton *PbPut,*PbGet;
 QNetworkAccessManager manager;//这个是重点
protected slots:
 //处理按钮的点击信号
 void slotPut();
 void slotGet();
 //处理网络连接的信号
 void managePut(QNetworkReply*);
 void manageGet(QNetworkReply*);
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
Dialog::Dialog(QWidget *parent)
 : QDialog(parent)
{
 setWindowTitle("My Ftp");
 layout=new QGridLayout(this);
 LbServer=new QLabel("Server:");
 LbUser=new QLabel("User:");
 LbPasswd=new QLabel("Passwd:");
 LeServer=new QLineEdit("ftp://120.27.41.126/home/myths/1.txt");
 LeUser=new QLineEdit("myths");
 LePasswd=new QLineEdit("123456");
 LePasswd->setEchoMode(QLineEdit::Password);//设置加密显示
 PbPut=new QPushButton("Put");
 PbGet=new QPushButton("Get");
 layout->addWidget(LbServer,0,0);
 layout->addWidget(LeServer,0,1);
 layout->addWidget(LbUser,1,0);
 layout->addWidget(LeUser,1,1);
 layout->addWidget(LbPasswd,2,0);
 layout->addWidget(LePasswd,2,1);
 layout->addWidget(PbPut,3,0);
 layout->addWidget(PbGet,3,1);
 setFixedSize(300,200);//固定大小
 //按钮点击事件信号槽的连接
 connect(PbPut,SIGNAL(clicked()),this,SLOT(slotPut()));
 connect(PbGet,SIGNAL(clicked()),this,SLOT(slotGet()));
}
void Dialog::managePut(QNetworkReply * reply){
 qDebug()<<reply->error();//输出调试信息
 switch(reply->error()){//判断连接后的状态
 case QNetworkReply::NoError:
 QMessageBox::information(this,"Put information","Upload Success!");
 break;
 case QNetworkReply::HostNotFoundError:
 QMessageBox::information(this,"Put information","Host Not Found!");
 break;
 case QNetworkReply::AuthenticationRequiredError:
 QMessageBox::information(this,"Put information","Login Failure!");
 break;
 default:
 QMessageBox::information(this,"Put information","Unknown Failure");
 break;
 }
}
void Dialog::manageGet(QNetworkReply *reply){
 //基本和managerPut类似 
 qDebug()<<reply->error();
 QByteArray data;
 switch(reply->error()){
 case QNetworkReply::NoError:
 data=reply->readAll();//从url中读取文件内容,输出到data中(也可以再将数据写入到文件中,为了方便,这里就权且打印一下吧)
 QMessageBox::information(this,"Put information","Upload Success!nThe file you've got is :n"+data);
 break;
 case QNetworkReply::HostNotFoundError:
 QMessageBox::information(this,"Put information","Host Not Found!");
 break;
 case QNetworkReply::AuthenticationRequiredError:
 QMessageBox::information(this,"Put information","Login Failure!");
 break;
 default:
 QMessageBox::information(this,"Put information","Unknown Failure");
 break;
 }
}
Dialog::~Dialog()
{
}
void Dialog::slotPut(){
 //判断信息输入完整
 if(LeUser->text().isEmpty()||LePasswd->text().isEmpty()||LeServer->text().isEmpty()){
 QMessageBox::warning(this,"Error","Please fill in the information");
 return ;
 }
 //重点!将之前的槽清空并重新连接至需要的
 manager.disconnect(SIGNAL(finished(QNetworkReply*)));
 //完全清空某对象连接的槽可以用manager.disconnect();
 connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(managePut(QNetworkReply*)));
 //设置登录信息
 QUrl url(LeServer->text());
 url.setPort(21);
 url.setUserName(LeUser->text());
 url.setPassword(LePasswd->text());
 QByteArray data="This is the test data.n";
 /*QNetworkReply *reply=*/
 manager.put(QNetworkRequest(url),data);//将data上传到url中,返回的reply将触发网络的连接信号
}
void Dialog::slotGet(){
 //基本意义与slotPut类似
 if(LeUser->text().isEmpty()||LePasswd->text().isEmpty()||LeServer->text().isEmpty()){
 QMessageBox::warning(this,"Error","Please fill in the information");
 return ;
 }
 manager.disconnect(SIGNAL(finished(QNetworkReply*)));
 connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(manageGet(QNetworkReply*)));
 QUrl url(LeServer->text());
 url.setPort(21);
 url.setUserName(LeUser->text());
 url.setPassword(LePasswd->text());
 /*QNetworkReply *reply=*/
 manager.get((QNetworkRequest(url)));
}

main.cpp

#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 Dialog w;
 w.show();
 return a.exec();
}

5、运行截图

权且只显示主界面:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • php实现文件下载实例分享

    举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • Visual Studio 2015下载和安装图文教程

    这篇文章主要为大家详细介绍了Visual Studio 2015下载和安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • DWVA上传漏洞挖掘的测试例子

    DVWA (Dam Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞...2016-11-25
  • PHP swfupload图片上传的实例代码

    PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
  • 百度编辑器ueditor修改图片上传默认路径

    本案例非通用,仅作笔记以备用 修改后的结果是 百度编辑器里上传的图片路径为/d/file/upload1...2014-07-03
  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • 借助FileReader实现将文件编码为Base64后通过AJAX上传

    这篇文章主要介绍了借助FileReader实现将文件编码为Base64后通过AJAX上传的方法,包括后端对文件数据解码并保存的PHP代码,需要的朋友可以参考下...2015-12-25
  • PHP的APC模块实现上传进度条

    APC模块,它的全称是Alternative PHP Cache。APC可以将所有PHP代码会被缓存起来, 另外它可提供一定的内存缓存功能.但是这个功能并不是十分完美,有报告说如果频繁使用APC缓存的写入功能,会导致不可预料的错误.如果想使用...2015-10-30
  • jQuery+ajax简单实现文件上传的方法

    这篇文章主要介绍了jQuery+ajax简单实现文件上传的方法,结合实例形式简单分析了jQuery基于ajax的post方法进行文件传输及asp.net后台处理技巧,需要的朋友可以参考下...2016-06-12
  • smartupload实现文件上传时获取表单数据(推荐)

    这篇文章主要介绍了smartupload实现文件上传时获取表单数据的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-01-09
  • Qt 使用Poppler实现pdf阅读器的示例代码

    下面小编就为大家分享一篇Qt 使用Poppler实现pdf阅读器的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • 适用于初学者的简易PHP文件上传类

    本文实例讲述了PHP多文件上传类,分享给大家供大家参考。具体如下:<&#63;phpclass Test_Upload{ protected $_uploaded = array(); protected $_destination; protected $_max = 1024000; protected $_messages =...2015-10-30
  • Java实现将图片上传到webapp路径下 路径获取方式

    这篇文章主要介绍了Java实现将图片上传到webapp路径下 路径获取方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-12