Ich versuche, QNetworkAccessManager zu verwenden, um HTTP-Multipart auf einen dedizierten Server hochzuladen.QNetworkAccessManager: Post http Multipart von serieller QIODevice
Der Multipart besteht aus einem JSON-Teil, der die hochgeladenen Daten beschreibt.
Die Daten werden von einem seriellen QIODevice gelesen, der die Daten verschlüsselt.
Dies ist der Code, der die mehrt Anfrage erstellt:
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart metaPart;
metaPart.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
metaPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"metadata\""));
metaPart.setBody(meta.toJson());
multiPart->append(metaPart);
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(fileFormat));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\""));
filePart.setBodyDevice(p_encDevice);
p_encDevice->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
multiPart->append(filePart);
QNetworkAccessManager netMgr;
QScopedPointer<QNetworkReply> reply(netMgr.post(request, multiPart));
multiPart->setParent(reply.data()); // delete the multiPart with the reply
Wenn die p_encDevice eine Instanz von QFile ist, die Datei einfach gut hochgeladen wird.
Wenn die spezialisierte Verschlüsselung QIODevice verwendet wird (serielles Gerät), werden alle Daten von meinem benutzerdefinierten Gerät gelesen. QNetworkAccessManager :: post() wird jedoch nicht abgeschlossen (hängt).
ich in der Dokumentation von QHttpPart dass lesen:
wenn das Gerät sequentiell (zB Steckdosen, aber keine Dateien), QNetworkAccessManager :: post() sollte aufgerufen werden, nachdem Gerät fertig emittiert hat() .
Leider weiß ich nicht, wie das geht.
Bitte beraten.
EDIT:
QIODevice haben nicht fertig() Slot überhaupt. Außerdem passiert das Lesen von meinem benutzerdefinierten IODevice überhaupt nicht, wenn QNetworkAccessManager :: post() nicht aufgerufen wird und das Gerät daher kein solches Ereignis ausgeben kann. (Catch 22?)
EDIT 2:
Es scheint, dass QNAM nicht mit sequentiellen Geräten funktioniert. Siehe discussion on qt-project.
EDIT 3:
ich es geschafft, zu „täuschen“ QNAM, um es glauben zu machen, dass sie von nicht-sequenzielle Geräte ist das Lesen, sondern suchen und Reset-Funktionen sucht verhindern. Dies wird funktionieren, bis QNAM versuchen wird, zu suchen.
bool AesDevice::isSequential() const
{
return false;
}
bool AesDevice::reset()
{
if (this->pos() != 0) {
return false;
}
return QIODevice::reset();
}
bool AesDevice::seek(qint64 pos)
{
if (this->pos() != pos) {
return false;
}
return QIODevice::seek(pos);
}
Ich denke, das entsprechende Signal ist 'QIODevice :: readChannelFinished()'. Grundsätzlich muss 'QIODevice :: bytesAvailable()' den korrekten Wert zurückgeben, damit es funktioniert. –
Haben Sie das Problem seitdem gelöst, matejk? – lpapp
Ich habe es gelöst, aber nicht auf eine saubere Art und Weise. Siehe meinen Kommentar unten. – matejk