QNetworkManager上传文件到FTP崩溃(QNetworkManager uploadin

2019-10-19 03:05发布

我想一个简单的测试文本文件上传到FTP服务器。 为了实现这一目标,我使用QNetworkAccessManager ,因为QFtp已在Qt的5.1被弃用。

我创建的程序目录中的test.txt文件,使用QFile时 ,我打开它QIODevice::ReadWrite | QIODevice::Text QIODevice::ReadWrite | QIODevice::Text

问题是,当我设置的连接,并告诉QNetworkAccessManager将文件上载程序崩溃(“FTPConnectionTest不响应”)。 它发生的时候都我试图使用外部FTP服务器或创建了本地一个FileZilla

我连接通过所述回复发射的所有信号:(功能uploadFinishuploadProgressuploadError然而,没有反馈beeing捕获)。

问:这方面的问题倒在FTP服务器端还是我做错事在我的代码? 下面的代码剪断:

Main.cpp的

#include <QCoreApplication>
#include <ftp.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Ftp ftp;
    return a.exec();
}

ftp.cpp

#include "ftp.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
#include <QFile>
#include <QUrl>
#include <QDebug>

Ftp::Ftp()
{   
    QFile file("test.txt");
    if (file.open(QIODevice::ReadWrite | QIODevice::Text)) {
        url = QUrl("ftp://127.0.0.1/test.txt");
        url.setUserName("user");
        url.setPassword("password");

        qDebug() << "URL set" << url;

        QNetworkAccessManager* nam = new QNetworkAccessManager();
        qDebug() << "nam set";
        QNetworkReply *rep = nam->put(QNetworkRequest(url), &file);
        qDebug() << "after rep";

        connect(rep, SIGNAL(finished()), this, SLOT(uploadFinish()));
        connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(uploadError(QNetworkReply::NetworkError)));
        connect(rep, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64)));
    }
    else qDebug() << "failed to open";
}

void Ftp::uploadFinish()
{
    qDebug() << "finished uploading file";
}

void Ftp::uploadProgress(qint64 a, qint64 b)
{
    qDebug() << a << "/" << b;
}

void Ftp::uploadError(QNetworkReply::NetworkError state)
{
    qDebug() << "State" << state;
}

Answer 1:

QNetworkAccessManager::put文档:

数据必须用于读时这个函数被调用,直到成品()信号被发射该应答必须保持有效打开。

你的file对象超出范围时,构造函数执行完毕,所以QNetworkAccessManager可能试图从已删除对象阅读。 你需要让file一类的成员变量,或使用创建QFile* file = new QFile()



文章来源: QNetworkManager uploading file to FTP crash