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

该多部分由一个JSON部分组成,该部分描述了要上传的数据。

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

这是创建多部分请求的代码:

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的文档中看到:



不幸的是我不知道该怎么做。

请指教。

编辑:

QIODevice根本没有finish()插槽。更重要的是,如果未调用QNetworkAccessManager::post(),则根本不会从我的自定义IODevice进行读取,因此该设备将无法发出此类事件。 ( catch 22吗?)

编辑2:

似乎QNAM根本无法与顺序设备一起使用。参见discussion on 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);
}

最佳答案

您将需要大量重构代码,以便传递给post的变量在您发布的函数之外可用,然后,您需要使用该代码定义一个新的插槽,以在实现内部执行post。最后,您需要执行connect(p_encDevice, SIGNAL(finished()), this, SLOT(yourSlot())将它们粘合在一起。

您几乎就在那儿,只需要对其进行重构,然后添加一个新插槽即可将其绑定(bind)到QIODevice::finished()信号即可。

关于qt - QNetworkAccessManager:从串行QIODevice发布http multipart,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15109656/

10-08 21:32