A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

效果

FtpManager

为了便于使用,封装一个简单的 FtpManager 管理类,用于上传、下载文件。

FTPManager.h



  • #ifndef FTP_MANAGER



  • #define FTP_MANAGER







  • #include <QUrl>



  • #include <QFile>



  • #include <QNetworkReply>



  • #include <QNetworkAccessManager>







  • class FtpManager : public QObject



  • {



  •     Q_OBJECT







  • public:



  •     explicit FtpManager(QObject *parent = 0);



  •     // 设置地址和端口



  •     void setHostPort(const QString &host, int port = 21);



  •     // 设置登录 FTP 服务器的用户名和密码



  •     void setUserInfo(const QString &userName, const QString &password);



  •     // 上传文件



  •     void put(const QString &fileName, const QString &path);



  •     // 下载文件



  •     void get(const QString &path, const QString &fileName);







  • signals:



  •     void error(QNetworkReply::NetworkError);



  •     // 上传进度



  •     void uploadProgress(qint64 bytesSent, qint64 bytesTotal);



  •     // 下载进度



  •     void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);







  • private slots:



  •     // 下载过程中写文件



  •     void finished();







  • private:



  •     QUrl m_pUrl;



  •     QFile m_file;



  •     QNetworkAccessManager m_manager;



  • };







  • #endif // FTP_MANAGER


FTPManager.cpp



  • #include <QFileInfo>



  • #include "FTPManager.h"







  • FtpManager::FtpManager(QObject *parent)



  •     : QObject(parent)



  • {



  •     // 设置协议



  •     m_pUrl.setScheme("ftp");



  • }







  • // 设置地址和端口



  • void FtpManager::setHostPort(const QString &host, int port)



  • {



  •     m_pUrl.setHost(host);



  •     m_pUrl.setPort(port);



  • }







  • // 设置登录 FTP 服务器的用户名和密码



  • void FtpManager::setUserInfo(const QString &userName, const QString &password)



  • {



  •     m_pUrl.setUserName(userName);



  •     m_pUrl.setPassword(password);



  • }







  • // 上传文件



  • void FtpManager::put(const QString &fileName, const QString &path)



  • {



  •     QFile file(fileName);



  •     file.open(QIODevice::ReadOnly);



  •     QByteArray data = file.readAll();







  •     m_pUrl.setPath(path);



  •     QNetworkReply *pReply = m_manager.put(QNetworkRequest(m_pUrl), data);







  •     connect(pReply, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64)));



  •     connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SIGNAL(error(QNetworkReply::NetworkError)));



  • }







  • // 下载文件



  • void FtpManager::get(const QString &path, const QString &fileName)



  • {



  •     QFileInfo info;



  •     info.setFile(fileName);







  •     m_file.setFileName(fileName);



  •     m_file.open(QIODevice::WriteOnly | QIODevice::Append);



  •     m_pUrl.setPath(path);







  •     QNetworkReply *pReply = m_manager.get(QNetworkRequest(m_pUrl));







  •     connect(pReply, SIGNAL(finished()), this, SLOT(finished()));



  •     connect(pReply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64)));



  •     connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SIGNAL(error(QNetworkReply::NetworkError)));



  • }







  • // 下载过程中写文件



  • void FtpManager::finished()



  • {



  •     QNetworkReply *pReply = qobject_cast<QNetworkReply *>(sender());



  •     switch (pReply->error()) {



  •     case QNetworkReply::NoError : {



  •         m_file.write(pReply->readAll());



  •         m_file.flush();



  •     }



  •         break;



  •     default:



  •         break;



  •     }







  •     m_file.close();



  •     pReply->deleteLater();



  • }


注意:下载过程中文件写入是在主线程中进行的,如果文件过大,频繁写入会造成主线程卡顿现象。要避免此种情况,请在工作线程中进行。

使用


  • // 构建需要的控件



  • QPushButton *pUploadButton = new QPushButton(this);



  • QPushButton *pDownloadButton = new QPushButton(this);



  • m_pUploadBar = new QProgressBar(this);



  • m_pDownloadBar = new QProgressBar(this);







  • pUploadButton->setText(QString::fromLocal8Bit("上传"));



  • pDownloadButton->setText(QString::fromLocal8Bit("下载"));







  • // 接信号槽



  • connect(pUploadButton, SIGNAL(clicked(bool)), this, SLOT(upload()));



  • connect(pDownloadButton, SIGNAL(clicked(bool)), this, SLOT(download()));







  • // 设置 FTP 相关信息



  • m_ftp.setHostPort("192.168.***.***", 21);



  • m_ftp.setUserInfo("wang", "123456");


其中,m_ftp 是类变量 FtpManager。



  • // 上传文件



  • void MainWindow::upload()



  • {



  •     m_ftp.put("E:\\Qt.zip", "/home/wang/Qt.zip");



  •     connect(&m_ftp, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError)));



  •     connect(&m_ftp, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));



  • }







  • // 下载文件



  • void MainWindow::download()



  • {



  •     m_ftp.get("/home/wang/Qt.zip", "F:\\Qt.zip");



  •     connect(&m_ftp, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError)));



  •     connect(&m_ftp, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));



  • }







  • // 更新上传进度



  • void MainWindow::uploadProgress(qint64 bytesSent, qint64 bytesTotal)



  • {



  •     m_pUploadBar->setMaximum(bytesTotal);



  •     m_pUploadBar->setValue(bytesSent);



  • }







  • // 更新下载进度



  • void MainWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)



  • {



  •     m_pDownloadBar->setMaximum(bytesTotal);



  •     m_pDownloadBar->setValue(bytesReceived);



  • }







  • // 错误处理



  • void MainWindow::error(QNetworkReply::NetworkError error)



  • {



  •     switch (error) {



  •     case QNetworkReply::HostNotFoundError :



  •         qDebug() << QString::fromLocal8Bit("主机没有找到");



  •         break;



  •         // 其他错误处理



  •     default:



  •         break;



  •     }



  • }


在上传、下载过程中,确保 Server 端的路径存在:



  • [root@localhost wang]# pwd



  • /home/wang



  • [root@localhost wang]# ls



  • hello.sh



  • [root@localhost wang]#


上传完成后,可以去 Server 端查看一下:



  • [root@localhost wang]# ls -l



  • 总用量 52980



  • -rw-r--r-- 1 root root       20 11月 16 14:01 hello.sh



  • -rw-r--r-- 1 wang  wang  54246299 11月 16 17:36 Qt.zip



  • [root@localhost wang]# md5sum Qt.zip



  • 8d010354447515d55c65d733bbba2682  Qt.zip





1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马