2013-12-13 48 views
1

我想上传一个简单的测试文本文件到FTP服务器。为了达到这个目的,我使用了QNetworkAccessManager,因为在Qt 5.1中不推荐使用QFtpQNetworkManager上传文件到FTP崩溃

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

问题是当我设置连接并告诉QNetworkAccessManager要上传程序崩溃的文件(“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(); 
} 

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文档:

数据必须阅读本时可以打开函数被调用并且必须保持有效,直到th e已完成()信号发出此回复。

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

+0

是的,在我阅读你的答案之前,我已经明白了自己的想法。谢谢。 –