Qt QNetworkManager将文件上载到FTP崩溃

Qt QNetworkManager将文件上载到FTP崩溃,qt,ftp,qnetworkaccessmanager,Qt,Ftp,Qnetworkaccessmanager,我试图上传一个简单的测试文本文件到FTP服务器。为了实现这一点,我正在使用,因为在Qt5.1中已经被弃用了 我在programs目录中创建了一个test.txt文件,并使用我打开它作为QIODevice::ReadWrite | QIODevice::Text 问题是,当我设置连接并告诉用户上载文件时,程序崩溃(“FTPConnectionTest不响应”)。当我尝试使用外部FTP服务器或使用FileZilla创建的本地FTP服务器时,都会发生这种情况 我连接了应答发出的所有信号(函数:uplo

我试图上传一个简单的测试文本文件到FTP服务器。为了实现这一点,我正在使用,因为在Qt5.1中已经被弃用了

我在programs目录中创建了一个test.txt文件,并使用我打开它作为
QIODevice::ReadWrite | QIODevice::Text

问题是,当我设置连接并告诉用户上载文件时,程序崩溃(“FTPConnectionTest不响应”)。当我尝试使用外部FTP服务器或使用
FileZilla
创建的本地FTP服务器时,都会发生这种情况

我连接了应答发出的所有信号(函数:
uploadFinish
uploadProgress
uploadError
),但是没有捕获任何反馈

问题:这个问题是FTP服务器方面的问题还是我的代码有问题? 代码截取如下:

Main.cpp

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

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Ftp ftp;
    return a.exec();
}
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
Ftp;
返回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;
}
#包括“ftp.h”
#包括
#包括
#包括
#包括
#包括
#包括
Ftp::Ftp()
{   
QFile文件(“test.txt”);
if(file.open(QIODevice::ReadWrite | QIODevice::Text)){
url=QUrl(“ftp://127.0.0.1/test.txt");
setUserName(“用户”);
设置密码(“密码”);

qDebug()请参阅
QNetworkAccessManager::put
文档:

调用此函数时,必须打开数据进行读取,并且必须保持有效,直到为此应答发出finished()信号


构造函数完成执行后,您的
文件
对象超出范围,因此
QNetworkAccessManager
可能试图从已删除的对象中读取。您需要将
文件
设为类成员变量,或使用
QFile*file=new QFile()创建它

请参阅
QNetworkAccessManager::put
文档:

调用此函数时,必须打开数据进行读取,并且必须保持有效,直到为此应答发出finished()信号


构造函数完成执行后,您的
文件
对象超出范围,因此
QNetworkAccessManager
可能试图从已删除的对象中读取。您需要将
文件
设为类成员变量,或使用
QFile*file=new QFile()创建它

是的,就是这样,在我读你的答案之前我自己就想出来了。谢谢。是的,就是这样,我在读你的答案之前就想出来了。谢谢。