Qt QFtp客戶端實現上傳下載文件

1.簡介

實現FTP客戶端有幾種方式。

  • Qt4 QFtp類
  • Qt5 QNetworkAccessManager類

QNetworkAccessManager支持大多數的網絡協議,比如http、ftp等,這裡主要講解QNetworkAccessManager實現的FTP客戶端。

需要添加 Qt += network 模塊。

2.用到的主要類

2.1QNetworkReply

QNetworkReply類包含使用QNetworkAccessManager發送的請求的數據和頭部。與QNetworkRequest類似,它包含一個URL和標題(包括解析的和原始的形式),一些關於應答狀態和應答本身內容的信息。

常用信號:

void downloadProgress(qint64 bytesReceived, qint64 bytesTotal) 下載進度信號
void error(QNetworkReply::NetworkError code) 有錯誤發生發出信號
void finished() 結束
void readyRead() 有數據來時會發出信號

2.2QNetworkRequest

QNetworkRequest類持有一個要用QNetworkAccessManager發送的請求,QNetworkRequest是網絡訪問API的一部分,是保存通過網絡發送請求所需信息的類。它包含一個URL和一些可用於修改請求的輔助信息。

常用方法:

void setUrl(const QUrl &url) 設置url
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue) 設置頭部

2.3QNetworkAccessManager

常用方法:

QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data) 將數據內容上載到目標請求
QNetworkReply *get(const QNetworkRequest &request) 發佈一個請求以獲取目標請求的內容

3.示例

3.1本地搭建一個FTP服務器。

快速搭建一個本地的FTP服務器

3.2示例

我按3.1中搭建好ftp服務器。

下載代碼:

首先彈出一個文件保存對話框,我在ftpserver中提前放好瞭一個data.txt的文件,然後設置QURL,設置用戶名,密碼,端口,采用get方法。有數據來後會收到readyRead信號,然後往文件中寫入數據就行瞭。

void WFtp::on_btnDownLoad_clicked()
{
    //選擇一個保存路徑
    //設置打開路徑
    QString filePath = "F://";
 
    //對話框標題
    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());
}

上傳代碼:

首先彈出一個文件選擇對話框,選擇要上傳的文件,讀取文件的數據到byte變量中,設置傳入到ftp sever中的文件名叫upLoad.txt,最後使用put方式上傳文件。

    //選擇一個保存路徑
    //設置打開路徑
    QString filePath = "F://";
 
    //對話框標題
    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);

上傳成功

 到此這篇關於Qt QFtp客戶端實現上傳下載文件的文章就介紹到這瞭,更多相關Qt QFtp上傳下載內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: