當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]簡(jiǎn)述 為了方便網(wǎng)絡(luò)編程,Qt 提供了 Network 模塊。該模塊包含了許多類(lèi),例如:QFtp - 能夠更加輕松使用 FTP 協(xié)議進(jìn)行網(wǎng)絡(luò)編程。 但是,從 Qt5.x 之后,Qt Network

簡(jiǎn)述

為了方便網(wǎng)絡(luò)編程,Qt 提供了 Network 模塊。該模塊包含了許多類(lèi),例如:QFtp - 能夠更加輕松使用 FTP 協(xié)議進(jìn)行網(wǎng)絡(luò)編程。

但是,從 Qt5.x 之后,Qt Network 發(fā)生了很大的變化,助手中關(guān)于此部分描述如下:

The QFtp and QUrlInfo classes are no longer exported. Use QNetworkAccessManager instead. Programs that require raw FTP or HTTP streams can use the Qt FTP and Qt HTTP compatibility add-on modules that provide the QFtp and QHttp classes as they existed in Qt 4.

意思是說(shuō):不再導(dǎo)出 QFtp 和 QUrlInfo 類(lèi),改用 QNetworkAccessManager。

簡(jiǎn)述開(kāi)啟 FTP 服務(wù)效果FtpManager使用更多參考

開(kāi)啟 FTP 服務(wù)

Linux 下實(shí)現(xiàn) FTP 服務(wù)的軟件很多,最常見(jiàn)的有:vsftpd、Wu-ftpd 和 Proftp 等。

訪問(wèn) FTP 服務(wù)器時(shí)需要經(jīng)過(guò)驗(yàn)證,只有經(jīng)過(guò)了 FTP 服務(wù)器的相關(guān)驗(yàn)證,用戶才能訪問(wèn)和傳輸文件。

首先,服務(wù)器需要安裝 FTP 軟件,以 vsftpd 為例:

[root@localhost wang]# which vsftpd
/sbin/vsftpd
1 2

這說(shuō)明服務(wù)器已經(jīng)安裝了 vsftpd,再進(jìn)行一系列配置即可使用。

關(guān)于 FTP 服務(wù)的搭建、配置屬于 Linux 范疇,這里就不過(guò)多贅述了,請(qǐng)自行查看資料。

效果

實(shí)現(xiàn)效果如下:

如果要獲取更多關(guān)于:文件剩余大小、平均速度、瞬時(shí)速度 、剩余時(shí)間等相關(guān)信息,請(qǐng)參考:Qt之HTTP上傳/下載

FtpManager

為了便于使用,封裝一個(gè)簡(jiǎn)單的 FtpManager 管理類(lèi),用于上傳、下載文件。

FTPManager.h

#ifndef FTP_MANAGER
#define FTP_MANAGER

#include 
#include 
#include 
#include 

class FtpManager : public QObject
{
    Q_OBJECT

public:
    explicit FtpManager(QObject *parent = 0);
    // 設(shè)置地址和端口
    void setHostPort(const QString &host, int port = 21);
    // 設(shè)置登錄 FTP 服務(wù)器的用戶名和密碼
    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);
    // 上傳進(jìn)度
    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);
    // 下載進(jìn)度
    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);

private slots:
    // 下載過(guò)程中寫(xiě)文件
    void finished();

private:
    QUrl m_pUrl;
    QFile m_file;
    QNetworkAccessManager m_manager;
};

#endif // FTP_MANAGER

FTPManager.cpp

#include 
#include "FTPManager.h"

FtpManager::FtpManager(QObject *parent)
    : QObject(parent)
{
    // 設(shè)置協(xié)議
    m_pUrl.setScheme("ftp");
}

// 設(shè)置地址和端口
void FtpManager::setHostPort(const QString &host, int port)
{
    m_pUrl.setHost(host);
    m_pUrl.setPort(port);
}

// 設(shè)置登錄 FTP 服務(wù)器的用戶名和密碼
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)));
}

// 下載過(guò)程中寫(xiě)文件
void FtpManager::finished()
{
    QNetworkReply *pReply = qobject_cast(sender());
    switch (pReply->error()) {
    case QNetworkReply::NoError : {
        m_file.write(pReply->readAll());
        m_file.flush();
    }
        break;
    default:
        break;
    }

    m_file.close();
    pReply->deleteLater();
}

注釋很詳細(xì),我就不再多做解釋了。。。

注意:下載過(guò)程中文件寫(xiě)入是在主線程中進(jìn)行的,如果文件過(guò)大,頻繁寫(xiě)入會(huì)造成主線程卡頓現(xiàn)象。要避免此種情況,請(qǐng)?jiān)诠ぷ骶€程中進(jìn)行。

使用

這里,只貼主要代碼:

// 構(gòu)建需要的控件
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("下載"));

// 接信號(hào)槽
connect(pUploadButton, SIGNAL(clicked(bool)), this, SLOT(upload()));
connect(pDownloadButton, SIGNAL(clicked(bool)), this, SLOT(download()));

// 設(shè)置 FTP 相關(guān)信息
m_ftp.setHostPort("192.168.***.***", 21);
m_ftp.setUserInfo("wang", "123456");

其中,m_ftp 是類(lèi)變量 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)));
}

// 更新上傳進(jìn)度
void MainWindow::uploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
    m_pUploadBar->setMaximum(bytesTotal);
    m_pUploadBar->setValue(bytesSent);
}

// 更新下載進(jìn)度
void MainWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    m_pDownloadBar->setMaximum(bytesTotal);
    m_pDownloadBar->setValue(bytesReceived);
}

// 錯(cuò)誤處理
void MainWindow::error(QNetworkReply::NetworkError error)
{
    switch (error) {
    case QNetworkReply::HostNotFoundError :
        qDebug() << QString::fromLocal8Bit("主機(jī)沒(méi)有找到");
        break;
        // 其他錯(cuò)誤處理
    default:
        break;
    }
}

在上傳、下載過(guò)程中,確保 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

源文件 Qt.zip 的大小為 54,246,299 字節(jié),顯然,目標(biāo)文件也一樣(可使用 MD5 比對(duì),看文件是否損壞),這說(shuō)明已經(jīng)完全上傳成功了。

更多參考

Qt之HTTP上傳/下載原文鏈接:http://blog.csdn.net/liang19890820/article/details/53188182

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉