4

如果 ftp 服务器需要身份验证,QNetworkAccessManager 似乎不会处理 ftp 检索到的丢失文件。

情况是这样的:我正在从需要用户名和密码的同一个 ftp 服务器下载多个文件。我成功下载了一些文件,然后为不存在的文件发送了 GET。该请求报告失败。然后,我为应该有效的文件发送 GET 请求。该请求永远不会发出完成的信号或错误。

Qt 4.7.4

请帮忙!这让我发疯了。我认为如果我能以某种方式重置 ftp 后端,这个问题可能是可以解决的。

4

2 回答 2

1

您正在像这样连接QNetworkReply信号finished()

QObject::connect(reply, SIGNAL(finished()), netty, SLOT(finished()));

而是尝试这样的完成信号QNetworkAccessManager

connect(&network, SIGNAL(finished(QNetworkReply *)), netty, SLOT(finished(QNetworkReply *)));

请注意,您必须更改finished() 插槽的原型。

最后一种方法是设置一个调用如下函数的计时器:

void check(QNetworkReply *reply){
 if(reply != NULL){
   if(reply->isFinished())
     finished(reply);
   else
     reply->abort();
 }
}

并注意这个错误:

https://bugreports.qt-project.org/browse/QTBUG-3443

于 2012-07-21T12:26:25.247 回答
1

我在使用 Qt 5.3.0 时遇到了同样的情况(好吧,它仍然是测试版,但我坚信 Qt5.2.x 上会重现相同的错误)。

QNetworkAccessManager 正确报告 ftp 的 fileNotFound 错误,但永远不会从中恢复。任何后续 ftp 请求都会失败并显示相同的错误消息。

假设尝试获取 badFile.txt(不存在)。我们得到正确的消息,即未找到 badFile.txt。如果我们然后尝试访问 goodFile.txt (存在),我们会得到

Error while downloading ftp://ftp.url.com/goodFile.txt: 
Downloading file failed:
Can't open /badFile.txt: No such file or directory"

以前的错误似乎永远停留在 QNetworkAccessManager 中。

对我有用的唯一解决方案是每次发生 ftp not found 错误时删除并创建一个新的 QNetworkAccessManager。这是通过简单地连接到 QNetworkReply 错误(QNetworkReply::NetworkError) 信号来完成的。正如 elmigranto 所说,完成的信号将为每个活动请求发出。这显然只有在 QNetworkAccessManager 处理单个请求时才有效,否则必须特别注意不要中止由同一管理器处理的任何并行请求。

QNetworkAccessManager finished(QNetworkReply*) 和 QNetworkReply finished() 信号做同样的事情。如 Qt 文档中所述,这两个信号是串联发出的。正如 buster 所说,这不是解决此问题的方法。

设置计时器可用于其他目的(例如连接超时),但也无法解决此特定问题。

于 2014-05-07T14:31:41.937 回答