【问题标题】:How to Download file using Qt5 with QNetworkAccessManager如何使用 Qt5 和 QNetworkAccessManager 下载文件
【发布时间】:2019-07-08 09:20:30
【问题描述】:

我需要一个非常简单的控制台应用程序来 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。

请帮帮我,这已经困扰我几天了..谢谢..

【问题讨论】:

    标签: c++ qt ftp qt5 qnetworkaccessmanager


    【解决方案1】:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多