我在Ubuntu 16.04.1 x64上使用Qt 5.7.0。
当我尝试使用QNetworkAccessManager :: post()传输文件时,会出现错误“QIODevice:device not open”。
奇怪的是,程序的发布版本肯定会出错,而同样的问题只发生在调试版本中长时间运行(看起来像那样)之后。
这是相对功能:
QHttpMultiPart* PacketFactory::getPacket(QString id, QString imgPath) {
QHttpMultiPart *pMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart idPart;
idPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
idPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"id\""));
idPart.setBody(id.toUtf8());
// some text/plain part
...
QFile *imgFile = new QFile(imgPath);
imgFile->setParent(pMultiPart);
Q_ASSERT(imgFile->open(QIODevice::ReadWrite));
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"img\"; filename=\"1.jpg\""));
imagePart.setBodyDevice(imgFile);
pMultiPart->append(imagePart);
return pMultiPart;
}
另:
QNetworkRequest NetManager::getRequest(int dst) {
QString url;
switch (op) {
case DST_LOCAL:
url = "http://127.0.0.1/query"
break;
...
}
return QNetworkRequest(QUrl(url));
}
这是调用代码:
QNetworkRequest request = m_pNetManager->getRequest(NetManager::DST_LOCAL);
QHttpMultiPart *pMultiPart = PacketFactory::getPacket(...);
QNetworkReply *pReply = m_NetworkAccessManager.post(request, pMultiPart);
QObject::connect(pReply, SIGNAL(finished()), this, SLOT(handlePacket()));
pMultiPart->setParent(pReply);
感谢您的建议。