Qt三种方式实现FTP上传功能

Qt三种方式实现FTP上传功能

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();