Qt之QNetworkAccessManager 实现FTP文件上传/下载功能

您所在的位置:网站首页 上传到ftp服务器错误 Qt之QNetworkAccessManager 实现FTP文件上传/下载功能

Qt之QNetworkAccessManager 实现FTP文件上传/下载功能

2024-06-21 07:14| 来源: 网络整理| 查看: 265

简述 

        Qt5移除了QFtp API,原因是其实现质量,QNetworkAccessManager 可以用来提供 ftp url 的上传下载操作; 但是美中不足的是QNetworkAccessManager没有提供list()、cd()、remove()、mkdir()、rmdir()、rename() 和 rawCommand()等操作。

效果

代码 

        首先封装了类是为了方便调用,减少代码重复:

#ifndef MYFTPMANAGER_H #define MYFTPMANAGER_H #include #include #include #include class MyFtpManager : public QObject { Q_OBJECT public: explicit MyFtpManager(QObject *parent = 0); QNetworkReply *put(const QString &localPath, const QString &uploadPath); QNetworkReply *get(const QString &downloadPath, const QString &localPath); inline void setPort(int port) { url.setPort(port); } inline void setHost(const QString &host) { url.setHost(host); } inline void setPath(const QString &path) { url.setPath(path); } inline void setUserName(const QString &userName) { url.setUserName(userName); } inline void setPassword(const QString &password) { url.setPassword(password); } public slots: void uploadFinished(); void downloadFinished(); void error(QNetworkReply::NetworkError error); private: QUrl url; QString path; QNetworkAccessManager manager; }; #endif // MYFTPMANAGER_H #include "MyFtpManager.h" #include #include MyFtpManager::MyFtpManager(QObject *parent) : QObject(parent) { // 设置协议 url.setScheme("ftp"); } QNetworkReply *MyFtpManager::put(const QString &localPath, const QString &uploadPath) { // 文件是否可以打开 QFile file(localPath); if (!file.open(QIODevice::ReadOnly)) return NULL; // 设置上传路径 url.setPath(uploadPath); QNetworkReply *pReply = manager.put(QNetworkRequest(url), file.readAll()); connect(pReply, SIGNAL(finished()), SLOT(uploadFinished())); connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(error(QNetworkReply::NetworkError))); return pReply; } QNetworkReply *MyFtpManager::get(const QString &downloadPath, const QString &localPath) { // 记录要保存的位置 path = localPath; // 设置下载路径 url.setPath(downloadPath); QNetworkReply *pReply = manager.get(QNetworkRequest(url)); connect(pReply, SIGNAL(finished()), SLOT(downloadFinished())); connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(error(QNetworkReply::NetworkError))); return pReply; } void MyFtpManager::uploadFinished() { } void MyFtpManager::downloadFinished() { QNetworkReply *pReply = qobject_cast(sender()); if (pReply == NULL) return; // 如果有错误就不需要保存 if (pReply->error() != QNetworkReply::NoError) return; // 写入文件 QFile file(path); if (!file.open(QIODevice::WriteOnly)) return; file.write(pReply->readAll()); file.flush(); file.close(); } void MyFtpManager::error(QNetworkReply::NetworkError error) { qDebug() setValue(byteSend); } void MainWnd::downloadProgress(qint64 byteSend, qint64 byteTotal) { ui->pgbDownload->setMaximum(byteTotal); ui->pgbDownload->setValue(byteSend); } 注意

        1. 使用QUrl时需要设置'ftp'协议,否则会提示以下的错误:

        2. 在点击上传时,要上传的目录必须存在,也就是说这里上传的目录"/picture"是事先在服务器创建好的;如果服务器中不存在这个目录它不会主动帮你创建,会提示以下的错误:

QNetworkReply::NetworkError(ContentAccessDenied)

        源码下载1(折扣):https://item.taobao.com/item.htm?ft=t&id=702584276003

        源码下载2(无折扣):https://download.csdn.net/download/Ilson_/19418875

        Windows下FTP服务器搭建:https://blog.csdn.net/Ilson_/article/details/97818689

        QFtp在客户端实现给服务器一次性创建多级目录:https://blog.csdn.net/Ilson_/article/details/98654137

        QFtp实现文件上传、下载、新建文件夹、重命名、删除和刷新等功能:https://blog.csdn.net/Ilson_/article/details/98371848



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3