В моем приложении у меня есть способ загрузить файлы на сервер, это отлично работает.Ошибка многократных закачек QNetworkAccessManager
Но когда я вызываю этот метод несколько раз подряд (как итерация по результату selectFilesDialog), первые 7 (более или менее) файлов загружаются правильно, остальные никогда не загружаются.
Я думаю, что это должно быть связано с тем, что сервер не позволяет больше, чем X-соединений из одного источника, может быть?
Как я могу убедиться, что загрузка ждет бесплатного установленного соединения?
это мой метод:
QString Api::FTPUpload(QString origin, QString destination)
{
qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
QUrl url("ftp://ftp."+getLSPro("domain")+destination);
url.setUserName(getLSPro("user"));
url.setPassword(getLSPro("pwd"));
QFile *data = new QFile(origin, this);
if (data->open(QIODevice::ReadOnly))
{
QNetworkAccessManager *nam = new QNetworkAccessManager();
QNetworkReply *reply = nam->put(QNetworkRequest(url), data);
reply->setObjectName(QString::number(timestamp));
connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(uploadProgress(qint64, qint64)));
return QString::number(timestamp);
}
else
{
qDebug() << "Could not open file to FTP";
return 0;
}
}
void Api::uploadProgress(qint64 done, qint64 total) {
QNetworkReply *reply = (QNetworkReply*)sender();
emit broadCast("uploadProgress","{\"ref\":\""+reply->objectName()+"\" , \"done\":\""+QString::number(done)+"\", \"total\":\""+QString::number(total)+"\"}");
}
Вы создаете новый QNetworkAccessManager для каждого загружаемого файла. Это не обязательно; вам нужен только один. Кроме того, поскольку вы не поддерживаете указатель на объект, вы также будете пропускать память. Также обратите внимание, что ответ QNetwork имеет ошибку сигнала (QNetworkReply :: NetworkError code), которую вы должны обрабатывать, чтобы увидеть, какова фактическая проблема при загрузке, а не гадать, что проблема связана с максимальными соединениями сервера. – TheDarkKnight
Хорошо, я переместил QNetworkAccesManager снаружи и повторно использовал то же самое, теперь закачки выполняются один за другим со вторым или около того между ними. Я предполагаю, что у QnetworkAccessManager есть какая-то очередь. Слишком плохо, что не существует какого-либо множественного свойства сразу. Благодаря! Не поддерживать указатель? где какой объект? (Im beginner with the concept of pointers) –
Каждый раз, когда вы используете ключевое слово 'new', вы должны следить за тем, чтобы вы поддерживали указатель на него и вызывали «delete», когда вы закончили с ним. В этом случае отображаемый код создавал QNetworkAccessManager с именем «nam», который затем выходит за рамки. Объект существует, но у вас нет указателя на вызов delete, когда вам больше не нужен объект или когда программа завершает работу. Те же правила применяются к объекту QNetworkReply «reply», так как это новый объект, созданный и предоставляемый вам вызовом put(). – TheDarkKnight