www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

簡(jiǎn)述

為了方便網(wǎng)絡(luò)編程,Qt 提供了 Network 模塊。該模塊包含了許多類,例如: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.

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

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

開啟 FTP 服務(wù)

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

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

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

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

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

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

效果

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

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

FtpManager

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

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:
    // 下載過程中寫文件
    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)));
}

// 下載過程中寫文件
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ì),我就不再多做解釋了。。。

注意:下載過程中文件寫入是在主線程中進(jìn)行的,如果文件過大,頻繁寫入會(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 是類變量 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ī)沒有找到");
        break;
        // 其他錯(cuò)誤處理
    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

源文件 Qt.zip 的大小為 54,246,299 字節(jié),顯然,目標(biāo)文件也一樣(可使用 MD5 比對(duì),看文件是否損壞),這說明已經(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)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉