在我的應用程序中,我有一種方法將文件上傳到服務器,這工作正常。QNetworkAccessManager多次上傳失敗
但是當我一次調用這個方法多次(比如迭代chooseFilesDialog的結果)前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代碼),您應該處理這些錯誤以查看上傳失敗時的實際問題,而不是猜測問題出在服務器的最大連接上。 – TheDarkKnight
好吧,我把QNetworkAccesManager移到了外面再重複使用,現在上傳是一個接一個地進行的,其間有一秒左右的時間。我假設QnetworkAccessManager有某種隊列。太糟糕了,並不存在某種多重屬性。謝謝! 不維護指針?哪裏有什麼對象? (初學者與指針的概念) –
任何時候你使用關鍵字'新',你應該確保你保持一個指針,並在完成它時調用'刪除'。在這種情況下,您顯示的代碼創建了名爲'nam'的QNetworkAccessManager,然後超出範圍。該對象存在,但當您不再需要該對象或程序退出時,您沒有指向調用delete的指針。同樣的規則適用於QNetworkReply對象的「回覆」,因爲它是通過調用put()創建並給予您的新對象。 – TheDarkKnight