百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Qt三种方式实现FTP上传功能_qt引入qftp库

yuyutoo 2025-02-18 14:02 10 浏览 0 评论

FTP协议

FTP的中文名称是“文件传输协议”,是File Transfer Protocol三个英文单词的缩写。FTP协议是TCP/IP协议组中的协议之一,其传输效率非常高,在网络上传输大的文件时,经常采用该协议。

FTP协议又分??主动模式???和??被动模式???,? ???本文不做过多介绍。

三种方式

废话不多说,直接先上结果。

三种方式实现Qt项目中的Ftp传输功能:

1、Qt4 QFtp

2、Qt5 QNetworkAccessManager

3、POCO中的 FTPClientSession

接下来我们一一分析这几种方式的优缺点。

QFtp

先来说说QFtp,QFtp是Qt4中的专门负责Ftp传输的类,Ftp相关的常用接口都已经包含了,比如说:创建目录、删除目录、删除文件、获取文件列表、上传、下载等等常规操作。

int setProxy(const QString &host, quint16 port);
    int connectToHost(const QString &host, quint16 port=21);
    int login(const QString &user = QString(), const QString &password = QString());
    int close();
    int setTransferMode(TransferMode mode);
    int list(const QString &dir = QString());
    int cd(const QString &dir);
    int get(const QString &file, QIODevice *dev=0, TransferType type = Binary);
    int put(const QByteArray &data, const QString &file, TransferType type = Binary);
    int put(QIODevice *dev, const QString &file, TransferType type = Binary);
    int remove(const QString &file);
    int mkdir(const QString &dir);
    int rmdir(const QString &dir);
    int rename(const QString &oldname, const QString &newname);

光看名字就知道其功能了,可以说是很全面的了。但不幸的是这么好用的东西竟然被Qt5给抛弃了,取而代之的是用 QNetworkAccessManager 来实现。

QNetworkAccessManager

QNetworkAccessManager 是Qt里面专门负责网络请求的模块,包含了http的post、get,还有一个put,而Qt5中要实现Ftp上传功能就通过put来完成,下载通过get来完成。

*put(const QNetworkRequest &request, QIODevice *data)
 QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data)
 QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *multiPart)

 QNetworkReply *get(const QNetworkRequest &request)

遗憾的是,没有办法通过QNetworkAccessManager 实现Ftp创建目录、删除目录、删除文件、获取文件列表等功能。只能做上传下载操作。

FTPClientSession

最后来看FTPClientSession,这是? ?POCO??中网络模块里面负责实现FTP的类,POCO是目前最流行的C++轻量级封装库之一,里面包含了很多常用的封装库。

?

而FTPClientSession提供了FTP的很多常用接口,如下:

void setTimeout(const Poco::Timespan& timeout);
  Poco::Timespan getTimeout() const;
  void setPassive(bool flag, bool useRFC1738 = true);
  bool getPassive() const;
  virtual void open(const std::string& host, Poco::UInt16 port, const std::string& username = "", const std::string& password = "");
  virtual void login(const std::string& username, const std::string& password);
  void logout();
  void close();
  std::string systemType();
  void setFileType(FileType type);
  FileType getFileType() const;
  void setWorkingDirectory(const std::string& path);
  std::string getWorkingDirectory();
  void cdup();
  void rename(const std::string& oldName, const std::string& newName);
  void remove(const std::string& path);
  void createDirectory(const std::string& path);
  void removeDirectory(const std::string& path);
  std::istream& beginDownload(const std::string& path);
  void endDownload();
  std::ostream& beginUpload(const std::string& path);
  void endUpload();
  std::istream& beginList(const std::string& path = "", bool extended = false);
  void endList();
  void abort();
  int sendCommand(const std::string& command, std::string& response);
  int sendCommand(const std::string& command, const std::string& arg, std::string& response);
  bool isOpen() const;
  bool isLoggedIn() const;
  bool isSecure() const;
  const std::string& welcomeMessage();

可以看到,FTPClientSession提供的这些接口基本包含了所有的Ftp上传的需求。

以上三种方式都可以实现FTP的上传,但是这三种各有各的优缺点,本人在使用过程中遇到了各种各样的问题,这三种都有结合使用,那么,接下来整理一下这段时间在使用这三种方式的区别和优缺点。

三者区别

QFtp

首先来看QFtp,由于在Qt5中已经移除了该模块,所以如果要使用它的话就需要自己下载源码进行编译,还要解决各种编码问题,其实挺麻烦的。

优点:接口完整,而且使用方便,该有的接口都有

缺点:要自己编译源码,或者可以直接使用源码嵌入到项目中,然后要解决编码问题;对于异常处理不是太好,比如突然断网,收不到异常信号,也不会报错,甚至连接状态都不会改变,联网后不能继续上传,会一直假死,这种情况下处理异常就很不友好了,需要自己去解决这个问题。

QNetworkAccessManager

优点:简单,集成度高;对于异常的处理比较友好,比如断网后,会立马收到信号反馈,用户可以及时去处理剩下的任务,而且在超时时间内如果连接上网络后可以继续接着上一次的任务进行上传,这一点非常好,给开发省了不少事情。

缺点:太过于简单了,很多接口都没有,就只能做个上传下载,不能创建文件夹、删除文件等操作。

FTPClientSession

优点:使用简单,而且基本ftp的基本操作接口都有提供,对异常处理可以抛出异常,通过try catch进行捕捉,比如说删除不存在的文件夹、创建已存在的文件夹等,这些操作会直接导致程序崩溃退出,需要捕捉异常去处理;

缺点:没有提供上传下载进度的接口或回调,如果需要展示进度功能的话,就很麻烦了,需要自己计算上传了多少字节,还剩多少字节。对网络异常的处理也不是很友好,毕竟不能像Qt那样直接发信号通知。

另外,???FTPClientSession???可以通过??beginList??接口获取服务器上的文件列表,然后通过读取流的方式得到列表内容,但是如果文件名称中带有空格,那么获取到的文件名就会分开了,不是完整的文件名,比如,有个文件名叫 “abc 12 ed.mp3” ,通过流读取到的内容是 “abc” , “12” , “ed.mp3” ,这样读取文件列表就会有很大的问题了。而通过QFtp读取文件列表就是正常的。

还有一个非常重要的问题,FTP上传的数据有两种方式,一种是ASCII码上传,一种是通过二进制数据上传,这两种方式上传会影响上传后的文件大小,而据说QNetworkAccessManager 默认是通过二进制流上传,但是上传后文件大小变了,具体问题? ?可以看这里??,就是因为上传方式导致的,而QNetworkAccessManager 是不能修改上传方式的,这个问题比较严重了。QFtp和FTPClientSession都提供了上传方式的修改,从这一点上来说,QNetworkAccessManager 就很不适合了。

就我个人使用这三种方式的经验来看,QFtp是比较更适合的,能够满足使用需求,不过需要自己处理一些异常情况。

本篇只是简单介绍这三种方式优缺点,接下来会在后期的文章中单独列举demo展示如何使用。以及在实际的代码中遇到的各种各样的坑。

相关推荐

墨尔本一华裔男子与亚裔男子分别失踪数日 警方寻人

中新网5月15日电据澳洲新快网报道,据澳大利亚维州警察局网站消息,22岁的华裔男子邓跃(Yue‘Peter’Deng,音译)失踪已6天,维州警方于当地时间13日发布寻人通告,寻求公众协助寻找邓跃。华...

网络交友须谨慎!美国犹他州一男子因涉嫌杀害女网友被捕

伊森·洪克斯克(图源网络,侵删)据美国广播公司(ABC)25日报道,美国犹他州一名男子于24日因涉嫌谋杀被捕。警方表示,这名男子主动告知警局,称其杀害了一名在网络交友软件上认识的25岁女子。雷顿警...

一课译词:来龙去脉(来龙去脉 的意思解释)

Mountainranges[Photo/SIPA]“来龙去脉”,汉语成语,本指山脉的走势和去向,现比喻一件事的前因后果(causeandeffectofanevent),可以翻译为“i...

高考重要考点:range(range高考用法)

range可以用作动词,也可以用作名词,含义特别多,在阅读理解中出现的频率很高,还经常作为完形填空的选项,而且在作文中使用是非常好的高级词汇。...

C++20 Ranges:现代范围操作(现代c++白皮书)

1.引言:C++20Ranges库简介C++20引入的Ranges库是C++标准库的重要更新,旨在提供更现代化、表达力更强的方式来处理数据序列(范围,range)。Ranges库基于...

学习VBA,报表做到飞 第二章 数组 2.4 Filter函数

第二章数组2.4Filter函数Filter函数功能与autofilter函数类似,它对一个一维数组进行筛选,返回一个从0开始的数组。...

VBA学习笔记:数组:数组相关函数—Split,Join

Split拆分字符串函数,语法Split(expression,字符,Limit,compare),第1参数为必写,后面3个参数都是可选项。Expression为需要拆分的数据,“字符”就是以哪个字...

VBA如何自定义序列,学会这些方法,让你工作更轻松

No.1在Excel中,自定义序列是一种快速填表机制,如何有效地利用这个方法,可以大大增加工作效率。通常在操作工作表的时候,可能会输入一些很有序的序列,如果一一录入就显得十分笨拙。Excel给出了一种...

Excel VBA入门教程1.3 数组基础(vba数组详解)

1.3数组使用数组和对象时,也要声明,这里说下数组的声明:'确定范围的数组,可以存储b-a+1个数,a、b为整数Dim数组名称(aTob)As数据类型Dimarr...

远程网络调试工具百宝箱-MobaXterm

MobaXterm是一个功能强大的远程网络工具百宝箱,它将所有重要的远程网络工具(SSH、Telnet、X11、RDP、VNC、FTP、MOSH、Serial等)和Unix命令(bash、ls、cat...

AREX:携程新一代自动化回归测试工具的设计与实现

一、背景随着携程机票BU业务规模的不断提高,业务系统日趋复杂,各种问题和挑战也随之而来。对于研发测试团队,面临着各种效能困境,包括业务复杂度高、数据构造工作量大、回归测试全量回归、沟通成本高、测试用例...

Windows、Android、IOS、Web自动化工具选择策略

Windows平台中应用UI自动化测试解决方案AutoIT是开源工具,该工具识别windows的标准控件效果不错,但是当它遇到应用中非标准控件定义的UI元素时往往就无能为力了,这个时候选择silkte...

python自动化工具:pywinauto(python快速上手 自动化)

简介Pywinauto是完全由Python构建的一个模块,可以用于自动化Windows上的GUI应用程序。同时,它支持鼠标、键盘操作,在元素控件树较复杂的界面,可以辅助我们完成自动化操作。我在...

时下最火的 Airtest 如何测试手机 APP?

引言Airtest是网易出品的一款基于图像识别的自动化测试工具,主要应用在手机APP和游戏的测试。一旦使用了这个工具进行APP的自动化,你就会发现自动化测试原来是如此简单!!连接手机要进行...

【推荐】7个最强Appium替代工具,移动App自动化测试必备!

在移动应用开发日益火爆的今天,自动化测试成为了确保应用质量和用户体验的关键环节。Appium作为一款广泛应用的移动应用自动化测试工具,为测试人员所熟知。然而,在不同的测试场景和需求下,还有许多其他优...

取消回复欢迎 发表评论: