2014-06-23 112 views
1

我使用QNAM来处理使用FTP协议的上传。 全过程的工作,但我有一个奇怪的现象:Qt的QNetworkAccessManager长延迟到发射结束信号

这是我的方法:

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(); 
} 

当我上传文件时,上传进度发出:

qDebug() << sent << "/" << total; 

输出0/x直到x/x。 然后,它需要很长的时间,也许长达20秒成品信号被发射之前。 为什么这个延迟?

我试着忽略已完成的信号并自己发出信号当进度是sent==total但文件在另一端损坏。 (它并没有真正损坏,因为我只发送jpg,结果文件只有上半部分只有jpg,大部分只是灰色)。

我想为我的用户提供一个进度条,其中100%真的意味着这个过程完成了。 上传5秒,然后以100%保持20秒并不是很好。

+0

是它在运行什么传输模式?主动还是被动?很可能它已经完成上传文件,但FTP服务器没有给出确认码。 –

+0

我怎么知道? –

+0

我认为它通常将其设置为打开何种模式在FTP服务器上。 –

回答

0

文件上传的确在一些背景缓冲(QT socket缓存,系统套接字缓冲区,网络缓冲区),因此“进步”信号只是意味着你将数据发送到某个地方,也不是服务器已收到。当转移到远程侧和缓冲器的所有数据被刷新 虽然“完成”信号被发射。如果您需要知道传输的确切大小,您可以查找禁用请求或套接字或qnam缓冲/缓存。

+0

那么我将如何得到实际的进展如何? – gallileo