QNetworkManager 上传文件到 FTP 崩溃

Posted

技术标签:

【中文标题】QNetworkManager 上传文件到 FTP 崩溃【英文标题】:QNetworkManager uploading file to FTP crash 【发布时间】:2013-12-13 12:09:42 【问题描述】:

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

我在程序目录中创建了一个 test.txt 文件,并使用QFile 以QIODevice::ReadWrite | QIODevice::Text 打开它。

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

我连接了回复发出的所有信号(函数:uploadFinishuploadProgressuploadError)但是没有捕获任何反馈。

问题:这个问题是在 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;

【问题讨论】:

【参考方案1】:

请参阅QNetworkAccessManager::put 文档:

数据 必须在调用此函数时打开以供读取,并且必须保持有效,直到为此回复发出 finished() 信号。

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

【讨论】:

是的,就是这样,我在阅读您的答案之前自己想通了。谢谢。

以上是关于QNetworkManager 上传文件到 FTP 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

ABAP如何实现上传本地文件到FTP服务器

使用 QNetworkManager 时出现内存访问错误

FTP上传到哪个文件夹

FTP文件上传到HDFS上

ftp上传的文件为0kb怎么办

华为ftp服务器设置及远程获取文件