multipart由描述正在上传的数据的JSON部分组成。
数据从串行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
如果p_encDevice是QFile的实例,那么该文件可以成功上传。
如果使用专门的加密QIODevice(串行设备),则所有数据都从我的自定义设备中读取。但是QNetworkAccessManager :: post()不会完成(挂起)。
我在 QHttpPart的文档中读到:
如果设备是顺序的(例如套接字,但不是文件),则应在设备发出finished()之后调用QNetworkAccessManager :: post()。
不幸的是,我不知道如何做到这一点。
请给予建议。
编辑:
QIODevice根本没有finished()插槽。而且,如果未调用QNetworkAccessManager :: post(),则根本不会从我的自定义IODevice中读取,因此该设备将无法发出此类事件。(陷入困境?)
编辑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);
}
QIODevice::readChannelFinished()
。基本上,QIODevice::bytesAvailable()
必须返回正确的值才能正常工作。 - Dan Milburn