Qt QNetworkAccessManager длинная задержка для выдачи законченного сигнала

Я использую 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 / х до х / х.
Тогда это займет много времени, может быть до 20 секунд до того, как законченный сигнал испускается.
Почему эта задержка?

Я старался игнорируя законченный сигнал и сам испускаю сигнал когда прогресс в sent==total но файл поврежден на другом конце. (На самом деле он не поврежден, так как я отправляю только jpg. Полученный файл — только верхняя половина jpg. Большая часть — просто серая.)

Я хотел бы предоставить своим пользователям индикатор выполнения, который на 100% означает, что процесс завершен.
Загрузка в течение 5 секунд, а затем в течение 20 секунд на 100% не очень хорошо.

1

Решение

загрузка файла выполняет некоторую буферизацию в фоновом режиме (буферы сокетов qt, буферы системных сокетов, сетевые буферы), поэтому сигнал «прогресс» просто означает, что вы отправляете данные куда-либо, а сервер их не получает.
В то время как «готово» сигнал испускается, когда все данные, переданные на удаленную сторону и буферы сброшены. Если вам нужно узнать точный размер передаваемого файла, вы можете отключить запрос или сокет (ы) или буферизацию / кэширование qnam.

0

Другие решения


По вопросам рекламы [email protected]