QNetworkAccessManager:从串行QIODevice发布http multipart

mat*_*ejk 7 post qt http qt4 qnetworkaccessmanager

我正在尝试使用QNetworkAccessManager将http多部分上传到专用服务器.

multipart由描述正在上传的数据的JSON部分组成.

从串行QIODevice读取数据,该QIODevice对数据进行加密.

这是创建multipart请求的代码:

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
Run Code Online (Sandbox Code Playgroud)

如果p_encDevice是QFile的一个实例,则该文件上传得很好.

如果使用专用加密QIODevice(串行设备),则从我的自定义设备读取所有数据.但是QNetworkAccessManager :: post()没有完成(挂起).

我在QHttpPart的文档中读到:

如果设备是顺序的(例如套接字,但不是文件),则应在设备发出finished()后调用QNetworkAccessManager :: post().

不幸的是我不知道那是怎么回事.

请指教.

编辑:

QIODevice根本没有完成()插槽.更重要的是,如果没有调用QNetworkAccessManager :: post(),那么从我的自定义IODevice读取根本不会发生,因此设备将无法发出这样的事件.(赶上22?)

编辑2:

QNAM似乎根本不适用于顺序设备.请参阅有关qt-project的讨论.

编辑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);
}
Run Code Online (Sandbox Code Playgroud)

mat*_*ejk 0

从qt-project中的单独讨论和检查源代码来看,QNAM 似乎根本不适用于顺序。文档和代码都是错误的。