2013-12-13 6 views
1

간단한 테스트 텍스트 파일을 FTP 서버에 업로드하려고합니다. 이를 달성하기 위해 Qt 5.1에서는 QFtp이 사용되지 않으므로 QNetworkAccessManager을 사용하고 있습니다.QNetworkManager가 FTP 충돌로 파일 업로드

프로그램 디렉토리에 test.txt 파일을 만들고 QFile을 사용하여 QIODevice::ReadWrite | QIODevice::Text으로 열었습니다.

문제는 연결을 설정하고 QNetworkAccessManager에게 프로그램이 충돌하는 파일 ("FTPConnectionTest가 응답하지 않음")을 업로드하도록 지시하는 것입니다. FileZilla으로 만든 로컬 FTP 서버 나 외부 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까지 유효해야합니다. 이 응답에 대해 finished() 신호가 발생합니다.

귀하의 file 객체는 생성자가 실행을 완료 범위를 벗어날 때문에 QNetworkAccessManager은 아마 이미 삭제 된 개체에서 읽기를 시도합니다. file을 클래스 멤버 변수로 만들거나 QFile* file = new QFile()을 사용하여 만듭니다.

+0

네가 그 대답을 읽기 전에 나는 그걸 알아 냈다. 고맙습니다. –