2011-12-19 13 views
0

QFtpを使用してテキストファイルをFTPサーバーにアップロードしたいと考えています。Qt C++でファイルをアップロードするにはどうすればQFtp :: putを使用できますか?

これは私が持っているコードです:

QFile *file = new QFile("test.txt"); 
QFtp *ftp = new QFtp(); 

if(file->open(QIODevice::ReadWrite)) { 
    ftp->setTransferMode(QFtp::Active); 
    ftp->connectToHost(server); 
    ftp->login(name, password); 
    ftp->put(file, "test.txt"); 
    ftp->close(); 
} 

このコードを実行した後、私は私のftpサーバには何も表示されません。 QFtp :: putのドキュメントを見ると、最初のパラメータはQIODeviceまたはQByteArrayでなければなりません。私はこれをどのようにするべきですか?

編集:
だから私は今、このコードを持っている:これらの機能を持つ

//ftp.cpp 
QFile *file = new QFile("test.txt"); 
QFtp *ftp = new QFtp(); 

this->connect(ftp, SIGNAL(commandStarted(int)), SLOT(ftpCommandStarted(int))); 
this->connect(ftp, SIGNAL(commandFinished(int, bool)), SLOT(ftpCommandFinished(int, bool))); 
this->connect(ftp, SIGNAL(done(bool)), SLOT(ftpDone(bool))); 
this->connect(ftp, SIGNAL(dataTransferProgress(qint64, qint64)), SLOT(ftpDataTransferProgress(qint64, qint64))); 
this->connect(ftp, SIGNAL(stateChanged(int)), SLOT(ftpStateChanged(int))); 

if(file->open(QIODevice::ReadWrite)) { 
    ftp->setTransferMode(QFtp::Active); 
    ftp->connectToHost(server); 
    ftp->login(name, password); 
    ftp->put(file, "test.txt"); 
    ftp->close(); 
} 

を:

//ftp.h 
void ftpCommandStarted(int id); 
void ftpCommandFinished(int id, bool error); 
void ftpDone(bool); 
void ftpDataTransferProgress(qint64, qint64); 
void ftpStateChanged(int); 

//ftp.cpp 
void EmailDialog::ftpCommandStarted(int id) { 
    this->messageBox("Command Started: " + QString::number(id)); 
} 

void EmailDialog::ftpCommandFinished(int id, bool error) { 
    this->messageBox("Command Finished: " + QString::number(id) + " Error: " + (error ? "Error" : "No Error")); 
} 

void EmailDialog::ftpDone(bool error) { 
    this->messageBox("Done " + QString(error ? "Error" : "No Error")); 
} 

void EmailDialog::ftpDataTransferProgress(qint64 done, qint64 total) { 
    this->messageBox("Done: " + QString::number(done) + " Total: " + QString::number(total)); 
} 

void EmailDialog::ftpStateChanged(int state) { 
    QString text; 
    switch (state) { 
     case 0: 
      text = "QFtp::Unconnected"; 
      break; 
     case 1: 
      text = "QFtp::HostLookup"; 
      break; 
     case 2: 
      text = "QFtp::Connecting"; 
      break; 
     case 3: 
      text = "QFtp::Connected"; 
      break; 
     case 4: 
      text = "QFtp::LoggingIn"; 
      break; 
     case 5: 
      text = "QFtp::Closing"; 
      break; 
     default: 
      text = ""; 
      break; 
    } 
    this->messageBox(text); 
} 

しかし、私はスロットが呼び出されているという兆候を得ることはありません。私はメッセージボックスが現れない。私はここで間違って何をしていますか?

+0

今はるかに良くなっていますが、間違ったことを言うにはあまりにも多くのコードがありません。それをgithubやbitbucketにすべてアップロードできますか? –

+0

それはしばらくして、答えを選ぶことを検討するかもしれません... –

+0

@RickSmithこれらのどれも働かなかった。私はやっとこれをあきらめ、何かをしました。 –

答えて

1

QFtpクラスは非同期で動作し、データを転送します。したがって、connecToHost、put、error、currentCommand、およびclose関数を順次呼び出しても、実際にはこれらのコマンドは実行されません。あなたがする必要があるのは、信号とスロットを使用できるようにクラスを書くことです。あなたが転送を開始した後に信号をキャッチすることが鍵です。 QFtpの詳細な説明に記載されている例は、問題の明確化を示しています。/

+0

私のputコマンドは正しいのですか? –

+0

私はいくつかの編集を行った、あなたは見てみることができますか?ありがとう。 –

2

コードスニペットは正しいですが(コンパイルしようとしませんでした)、スニペット外にある可能性があります。

他の答えに応じて、を実行しないでください。は、コードを実行するために信号を捕捉する必要はありません。 put、closeなどを呼び出すと、それらのコマンドがキューに入れられ、準備ができたら実行されます。に関係なく、信号に接続しています。docsの「詳細な説明」を参照してください。つまり、信号に接続することを強くお勧めします。これは、ユーザーとデバッグのフィードバックを得るためです。

は限り、あなたの現在のコードが機能しない理由として、私が求めるだろう最も一般的な質問は以下のとおりです。

  1. はQFtpオブジェクトを含むクラスはQObjectのを拡張していますか?
  2. ヘッダーファイルにQ_OBJECTマクロが含まれていますか?
  3. QObjectを拡張したりQ_OBJECTマクロを追加してからqmakeを再実行しましたか?
  4. コンソールに「信号/スロットが存在しません」というエラーが表示されますか?これは通常、信号/スロットの名前にタイプミスがあることを意味します。
  5. アプリケーションにイベントループがありますか? QFtp requiresこれは、その呼び出しが非同期的に発生するようにキューイングするためです。また、動作させるためには、すべての信号とスロットにイベントループが必要です。通常はmain()にあるQApplicationでexecを呼び出すことでイベントループを開始します。
  6. あなたのFTP転送をブロックするファイアウォールルールはありますか? QFtp :: Passiveを使う必要があるかもしれません。

これは私が考えることができる基本的な問題です。がんばろう!

関連する問題