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