私は専用のサーバーにHTTPマルチパートをアップロードするQNetworkAccessManagerを使用しようとしています。QNetworkAccessManager:シリアルのQIODeviceからのポストのHTTPマルチパート
マルチは、アップロードされたデータを記述するJSON部分から成ります。
データは、データを暗号化シリアルのQIODeviceから読み出されます。 p_encDeviceがqfileによりのインスタンスである場合、そのファイルは正常にアップロードされます、
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
:
この
は、マルチパートリクエストを作成するコードです。専門の暗号化のQIODeviceを使用する場合(シリアルデバイス)、データのすべてが私のカスタムデバイスから読み込まれます。 QNetworkAccessManager :: post()は完了(ハング)しません。
私がいることをQHttpPartのドキュメントでお読みください。)デバイスがシーケンシャルである場合、デバイスは(完成放出さ を持っていた後(例えば、ソケットではなくファイル)、 QNetworkAccessManagerは::ポスト()と呼ばれるべき
。
残念ながら、私はそれを行う方法がわかりません。
お知らせください。
EDIT:
のQIODeviceは、すべての完成()スロットを持っていません。さらに、QNetworkAccessManager :: post()が呼び出されず、デバイスがそのようなイベントを発行できない場合、私のカスタムIODeviceからの読み取りはまったく起こりません。 (キャッチ22?)
EDIT 2:
QNAMが全くシーケンシャル・デバイスでは動作しないようです。 discussion on qt-projectを参照してください。
EDIT 3:
私は、それが非シーケンシャルデバイスから読んでいることを考えさせるためにQNAMを「だます」ことに成功したが、追求し、リセット機能が求めて防ぎます。これは、QNAMが実際にシークしようとするまで機能します。
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);
}
適切な信号は 'QIODevice :: readChannelFinished()'だと思います。基本的には 'QIODevice :: bytesAvailable()'は正しい値を返さなければなりません。 –
それ以来、問題は解決しましたか、matejkですか? – lpapp
私はそれを解決することができましたが、きれいな方法では解決できませんでした。以下の私のコメントを参照してください。 – matejk