簡體   English   中英

如何使用Qt5和QNetworkAccessManager下載文件

[英]How to Download file using Qt5 with QNetworkAccessManager

我需要一個非常簡單的控制台應用程序以FTP進入服務器並獲取一些文件,我嘗試使用QNetworkAccessManager,但似乎無法正常工作且什么也沒得到。

這是我的代碼,

ftp.h

    #ifndef FTP_H
#define FTP_H
#include <string>
#include <vector>

#include <qstring.h>
#include <qfile.h>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include "qdebug.h"

#include <QCoreApplication>
#include <QDebug>
#include <string>
#include <iostream>
#include <sstream>
#include <QTextStream>
#include <QObject>

class ftp
{
//    Q_OBJECT
public:
    ftp();

private:
    QNetworkAccessManager *manager;
    QNetworkReply *reply;

private slots:
    void slotError(QNetworkReply::NetworkError code);
    void replyFinished(QNetworkReply *reply);
};

#endif // FTP_H

ftp.cpp

#include "ftp.h"
#include "QDebug"

#include <qstring.h>
#include <qfile.h>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include "qdebug.h"

#include <QCoreApplication>
#include <QDebug>
#include <string>
#include <iostream>
#include <sstream>
#include <QTextStream>
#include <QObject>

using namespace std;

ftp::ftp()
{
    qDebug() << "ZSS Server Program Running Now ...";

    QTextStream cin(stdin);
    QString username;
    QString password;
    QString ip;
    QString port;

    cout << "Username : ";
    username = cin.readLine();

    cout << "Password : ";
    password = cin.readLine();

    cout << "IP Address : ";
    ip = cin.readLine();

    cout << "Port Number : ";
    port = cin.readLine();

    QUrl url;
    url.setScheme("ftp");
    url.setHost("10.228.7.74");
    url.setPath("/try/hello.txt");
    url.setPort(21);
    url.setUserName("ftpTest");
    url.setPassword("ftpTest");
    QNetworkRequest request(url);
    //request.setUrl(url);

    qDebug() << url;

    //cout << "Downloading File...";

    manager = new QNetworkAccessManager;
    reply = manager->get(request);
    QByteArray buffer = reply->readAll();
    qDebug() << buffer;

//    connect(reply , SIGNAL(error(QNetworkReply::NetworkError)), this,SLOT(slotError(QNetworkReply::NetworkError)));
//    connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
}

void ftp::slotError(QNetworkReply::NetworkError code)
{
    qDebug() << reply->errorString();
}

void ftp::replyFinished(QNetworkReply *reply)
{
//    QTextCodec *codec = QTextCodec::codecForName("utf8");
//    QString all = codectoUniCode(reply->readAll());
//    cout >> all;
//    reply->deleteLater();
}

運行代碼后,在我的文件夾內,看不到任何文件。 所以我qDebug()取出了所有響應和緩沖區,我發現緩沖區和響應為空,是否有我缺少的任何部分或做錯了其他事情? 我可以為此得到一個簡單的例子嗎?

這是控制台輸出的屏幕截圖,

代碼輸出

我使用qDebug()緩沖區,但是緩沖區上沒有任何內容,我使用3CDaemon創建了該ftp本地服務器,並且我指向了正確的文件夾並且我的ftp服務器正在運行,我可以使用命令提示符進行ftp在內部並獲取文件,只是無法使用Qt使其生成。

請幫助我,這已經困擾了我兩天了。謝謝。

QNetworkAccessManager::get是一個異步函數。 您可以使用它返回的QNetworkReply來監視下載進度,但還不能立即讀取。 您必須等到發出finished信號(由QNetworkAccessManagerQNetworkReply發出)之后,才能從中讀取數據。

如果您確實希望下載是同步的,則可以旋轉自己的本地事件循環,直到下載完成。 例如

QEventLoop loop;
QNetworkAccessManager mgr;
connect(&mgr, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);

QNetworkReply *reply = mgr.get(...);
loop.exec();
qDebug() << reply.readAll();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM