使用QNetworkAccessManager :: post传输文件得到QIODevice:设备未打开

时间:2016-12-20 01:17:25

标签: qt ubuntu networking

我在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);

感谢您的建议。

0 个答案:

没有答案