2

我使用 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 秒并不是很好。

4

1 回答 1

0

文件上传会在后台进行一些缓冲(qt 套接字缓冲区、系统套接字缓冲区、网络缓冲区),因此“进度”信号仅表示您将数据发送到某个地方,也没有该服务器收到它。当所有传输到远程端的数据和缓冲区都被刷新时,会发出“完成”信号。如果您需要知道传输的确切大小,您可以寻找禁用请求或套接字或 qnam 缓冲/缓存。

于 2014-09-02T20:09:08.580 回答