我使用QNAM来处理使用ftp协议的上传。 整个过程有效,但我有一个奇怪的行为:
这是我的方法:
void ftp::uploadFile(const QString &origin, const QString &destination)
{
QUrl url("ftp://"+host+""+destination);
url.setUserName(user);
url.setPassword(pwd);
url.setPort(21);
localFile = new QFile(origin, this);
if (localFile->open(QIODevice::ReadOnly))
{
reply = nam->put(QNetworkRequest(url), localFile);
QObject::connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(transferProgress(qint64, qint64)));
QObject::connect(reply, SIGNAL(finished()), this, SLOT(transferFinished()));
}
else qDebug() << localFile->errorString();
}
当我上传文件时,会发出uploadProgress:
qDebug() << sent << "/" << total;
输出0 / x直到x / x。 然后在发出完成的信号之前需要很长时间,可能最多20秒。 为什么会这么拖延?
当进度为sent==total
但是文件在另一端损坏时,我尝试忽略已完成的信号并自行发出信号。 (它并没有真正损坏,因为我只发送jpg,结果文件只是上半部分jpg。很大一部分只是灰色。)
我想为我的用户提供一个进度条,其中100%真正意味着该过程已完成。 上传5秒,然后在100%停留20秒并不是很好。
答案 0 :(得分:0)
文件上传在后台进行一些缓冲(qt套接字缓冲区,系统套接字缓冲区,网络缓冲区),以便进行“进展”。信号只是意味着您将数据发送到某个地方,而服务器也没有收到它。 虽然&#39;完成&#39;传输到远程端的所有数据和刷新缓冲区时发出信号。如果您需要知道转移的确切大小,您可能会寻找禁用请求或套接字或qnam buffring / caching。