2011-12-19 275 views
0

我想用QFtp将文本文件上传到FTP服务器。如何使用QFtp :: put上传Qt C++中的文件?

这是我的代码:此代码执行

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吗? – 2011-12-19 19:34:32

+0

这已经有一段时间了,你可以考虑选择一个答案...... – 2014-08-07 23:45:03

+0

@RickSmith这些都没有工作。我最终放弃了这一点,并做了其他事情。 – 2014-08-08 13:31:03

回答

1

QFtp类异步传输数据。因此,依次调用connecToHost,put,error,currentCommand和close函数永远不会执行任何命令。你需要做的是编写一个类,以便你可以使用信号和插槽。关键是在开始传输后捕获信号。在QFtp详细描述中列出的例子给出了一些关于你的问题的解释/

+0

我的put命令是否正确? – 2011-12-19 16:16:21

+0

我做了一些编辑,你可以看一下吗?谢谢。 – 2011-12-19 19:28:00

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。

这些都是我能想到的基本问题。祝你好运!