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