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()没有完成(挂起).
如果设备是顺序的(例如套接字,但不是文件),则应在设备发出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)
归档时间: |
|
查看次数: |
4464 次 |
最近记录: |