Qt QFtp客戶端實(shí)現(xiàn)上傳下載文件
1.簡介
實(shí)現(xiàn)FTP客戶端有幾種方式。
- Qt4 QFtp類
- Qt5 QNetworkAccessManager類
QNetworkAccessManager支持大多數(shù)的網(wǎng)絡(luò)協(xié)議,比如http、ftp等,這里主要講解QNetworkAccessManager實(shí)現(xiàn)的FTP客戶端。
需要添加 Qt += network 模塊。
2.用到的主要類
2.1QNetworkReply
QNetworkReply類包含使用QNetworkAccessManager發(fā)送的請求的數(shù)據(jù)和頭部。與QNetworkRequest類似,它包含一個(gè)URL和標(biāo)題(包括解析的和原始的形式),一些關(guān)于應(yīng)答狀態(tài)和應(yīng)答本身內(nèi)容的信息。
常用信號:
| void downloadProgress(qint64 bytesReceived, qint64 bytesTotal) | 下載進(jìn)度信號 |
| void error(QNetworkReply::NetworkError code) | 有錯(cuò)誤發(fā)生發(fā)出信號 |
| void finished() | 結(jié)束 |
| void readyRead() | 有數(shù)據(jù)來時(shí)會發(fā)出信號 |
2.2QNetworkRequest
QNetworkRequest類持有一個(gè)要用QNetworkAccessManager發(fā)送的請求,QNetworkRequest是網(wǎng)絡(luò)訪問API的一部分,是保存通過網(wǎng)絡(luò)發(fā)送請求所需信息的類。它包含一個(gè)URL和一些可用于修改請求的輔助信息。
常用方法:
| void setUrl(const QUrl &url) | 設(shè)置url |
| void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue) | 設(shè)置頭部 |
2.3QNetworkAccessManager
常用方法:
| QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data) | 將數(shù)據(jù)內(nèi)容上載到目標(biāo)請求 |
| QNetworkReply *get(const QNetworkRequest &request) | 發(fā)布一個(gè)請求以獲取目標(biāo)請求的內(nèi)容 |
3.示例
3.1本地搭建一個(gè)FTP服務(wù)器。
3.2示例
我按3.1中搭建好ftp服務(wù)器。

下載代碼:
首先彈出一個(gè)文件保存對話框,我在ftpserver中提前放好了一個(gè)data.txt的文件,然后設(shè)置QURL,設(shè)置用戶名,密碼,端口,采用get方法。有數(shù)據(jù)來后會收到readyRead信號,然后往文件中寫入數(shù)據(jù)就行了。
void WFtp::on_btnDownLoad_clicked()
{
//選擇一個(gè)保存路徑
//設(shè)置打開路徑
QString filePath = "F://";
//對話框標(biāo)題
QString dlgTitle="保存文件";
//文件過濾器
QString filter="文本文件(*.txt)";
//打開對話框
QString fileName=QFileDialog::getSaveFileName(this,dlgTitle,filePath,filter);
g_file.setFileName(fileName);
g_file.open(QIODevice::WriteOnly);
QString str = ui->lineEdit->text() + "data.txt";
QUrl url(str);
url.setPort(21);
url.setUserName(ui->leUser->text());
url.setPassword(ui->lePasswd->text());
QNetworkRequest request(url);
m_reply = m_accessManager->get(request);
connect(m_accessManager, &QNetworkAccessManager::finished, this, &WFtp::slotReplyFinished);
connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError)));
connect(m_reply, &QNetworkReply::downloadProgress, this, &WFtp::slotDownloadProgress);
connect(m_reply, &QNetworkReply::readyRead, this, &WFtp::slotRead);
}
void WFtp::slotRead()
{
g_file.write(m_reply->readAll());
}上傳代碼:
首先彈出一個(gè)文件選擇對話框,選擇要上傳的文件,讀取文件的數(shù)據(jù)到byte變量中,設(shè)置傳入到ftp sever中的文件名叫upLoad.txt,最后使用put方式上傳文件。
//選擇一個(gè)保存路徑
//設(shè)置打開路徑
QString filePath = "F://";
//對話框標(biāo)題
QString dlgTitle="保存文件";
//文件過濾器
QString filter="文本文件(*.txt)";
//打開對話框
QString fileName=QFileDialog::getOpenFileName(this,dlgTitle,filePath,filter);
g_file.setFileName(fileName);
g_file.open(QIODevice::ReadOnly);
QByteArray byte = g_file.readAll();
g_file.close();
QString str = ui->lineEdit->text() + "upLoad.txt";
QUrl url(str);
url.setPort(21);
url.setUserName(ui->leUser->text());
url.setPassword(ui->lePasswd->text());
QNetworkRequest request(url);
m_reply = m_accessManager->put(request,byte);
connect(m_accessManager, &QNetworkAccessManager::finished, this, &WFtp::slotReplyFinished);
connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError)));
connect(m_reply, &QNetworkReply::downloadProgress, this, &WFtp::slotDownloadProgress);上傳成功

到此這篇關(guān)于Qt QFtp客戶端實(shí)現(xiàn)上傳下載文件的文章就介紹到這了,更多相關(guān)Qt QFtp上傳下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
輸入3個(gè)字符串,將它們按照字母由大到小排序(示例代碼)
我們可以用string方法定義字符串變量。以下是具體實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10
C++編程使用findfirst和findnext查找及遍歷文件實(shí)現(xiàn)示例
這篇文章主要為大家介紹了C++編程如何使用findfirst和findnext查找及遍歷文件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
C++ vector模擬實(shí)現(xiàn)的代碼詳解
vector是表示可變大小數(shù)組的序列容器,就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存儲元素,本質(zhì)講,vector使用動態(tài)分配數(shù)組來存儲它的元素,本文將給大家詳細(xì)介紹一下C++ vector模擬實(shí)現(xiàn),需要的朋友可以參考下2023-07-07
C語言數(shù)據(jù)結(jié)構(gòu)之動態(tài)分配實(shí)現(xiàn)串
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之動態(tài)分配實(shí)現(xiàn)串的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中動態(tài)分配實(shí)現(xiàn)串的實(shí)例,需要的朋友可以參考下2017-10-10
C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法
寫過C++的朋友都知道,有時(shí)候程序編譯通過,并不能代表程序就是對的,在linux下做開發(fā)時(shí),經(jīng)常會遇到跑崩潰的情況,但是在終端只會報(bào)Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯(cuò)誤的快速定位,需要的朋友可以參考下2024-07-07

