Как скачать файл используя Qt5 с QNetworkAccessManager - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно очень простое консольное приложение для 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 () вычеркнул все ответы и буфер, я обнаружил, что буфер и ответ пустые, есть ли какая-то часть, которую я пропустил или что-то не так делал?Могу ли я получить простой пример для этого?

Вот скриншоты вывода консоли,

Output of code

Я qDebug () буфер, но буфер не имеет ничего наИтак, я создаю этот локальный ftp-сервер с помощью 3CDaemon, и я указал нужную папку, и мой ftp-сервер работает, я могу использовать командную строку, чтобы открыть ftp и получить файл, просто не могу сделать это с помощью Qt.

Пожалуйста, помогите мне, это беспокоило меня в течение нескольких дней .. Спасибо ..

1 Ответ

0 голосов
/ 15 февраля 2019

QNetworkAccessManager::get - асинхронная функция.Вы можете использовать QNetworkReply, который он возвращает, чтобы отслеживать ход загрузки, но не готов к немедленному чтению.Вам нужно подождать, пока не будет издан сигнал finished (либо QNetworkAccessManager, либо QNetworkReply), прежде чем вы сможете прочитать данные из него.

Если вы действительно хотите, чтобы загрузка была синхронной, выможет вращать свой собственный цикл локальных событий до завершения загрузки.Например

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

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