如果 ftp 服务器需要身份验证,QNetworkAccessManager 似乎不会处理 ftp 检索到的丢失文件。
情况是这样的:我正在从需要用户名和密码的同一个 ftp 服务器下载多个文件。我成功下载了一些文件,然后为不存在的文件发送了 GET。该请求报告失败。然后,我为应该有效的文件发送 GET 请求。该请求永远不会发出完成的信号或错误。
Qt 4.7.4
请帮忙!这让我发疯了。我认为如果我能以某种方式重置 ftp 后端,这个问题可能是可以解决的。
如果 ftp 服务器需要身份验证,QNetworkAccessManager 似乎不会处理 ftp 检索到的丢失文件。
情况是这样的:我正在从需要用户名和密码的同一个 ftp 服务器下载多个文件。我成功下载了一些文件,然后为不存在的文件发送了 GET。该请求报告失败。然后,我为应该有效的文件发送 GET 请求。该请求永远不会发出完成的信号或错误。
Qt 4.7.4
请帮忙!这让我发疯了。我认为如果我能以某种方式重置 ftp 后端,这个问题可能是可以解决的。
您正在像这样连接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();
}
}
并注意这个错误:
我在使用 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 所说,这不是解决此问题的方法。
设置计时器可用于其他目的(例如连接超时),但也无法解决此特定问题。