我使用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秒,这真的不太好。
文件上传在后台做一些缓冲(qt套接字缓冲区,系统套接字缓冲区,网络缓冲区)所以'进度'信号只是意味着你发送数据到某个地方,服务器也没有收到它。当所有数据传输到远程端并刷新缓冲区时,发出'finished'信号。如果您需要知道传输的确切大小,您可以查找禁用请求或套接字或qnam缓冲/缓存。