gpt4 book ai didi

qt5 - QHttpMultiPart 到 QByteArray

转载 作者:行者123 更新时间:2023-12-02 06:33:55 31 4
gpt4 key购买 nike

有没有办法将QHttpMultiPart转换为QByteArray或其他类似的二进制数据?

我发现QHttpMultiPart非常方便地编写邮件数据格式,但似乎非常依赖QNetworkAccessManager框架,并且据我搜索,没有直接的方法可以做到这一点。

我最接近的方法是将QHttpMultiPart附加到从QIODevice派生的QNetworkReply对象,然后使用 QIODevice::readAll(),但 QNetworkReply 没有公共(public)构造函数。

最佳答案

您可以子类化QNetworkAccessManager:其createRequest()方法(您必须实现)将接收一个包含所有发送数据的QIODevice使用 POST 请求;因此,您只需在您的这个假网络访问管理器上调用 post(..., multiPart) 即可读取数据。

这是我编写的辅助类:

multipart.h:

#include <QByteArray>
#include <QIODevice>
#include <QScopedPointer>

class QHttpMultiPart;

class MultipartPrivate;
class Multipart
{
public:
Multipart();
virtual ~Multipart();

QByteArray toByteArray(QHttpMultiPart *multiPart);

private:
QScopedPointer<MultipartPrivate> d_ptr;
Q_DECLARE_PRIVATE(Multipart)
};

multipart.cpp:

#include "multipart.h"

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>

class FakeReply: public QNetworkReply
{
Q_OBJECT
public:
FakeReply(const QNetworkRequest &req, QNetworkAccessManager *parent):
QNetworkReply(parent)
{
Q_UNUSED(req);
QNetworkReply::open(QIODevice::ReadOnly);
}
void abort() override {}
qint64 readData(char *, qint64) override { return 0; }
};

class MultipartPrivate: public QNetworkAccessManager
{
Q_OBJECT

using QNetworkAccessManager::QNetworkAccessManager;

QNetworkReply *createRequest(Operation op, const QNetworkRequest &req,
QIODevice *outgoingData) override {
Q_UNUSED(op);
m_data = outgoingData->readAll();
return new FakeReply(req, this);
}

public:
QByteArray m_data;
};

Multipart::Multipart():
d_ptr(new MultipartPrivate)
{
}

Multipart::~Multipart()
{
}

QByteArray Multipart::toByteArray(QHttpMultiPart *multiPart)
{
Q_D(Multipart);

QNetworkRequest dummy(QUrl("http://multipart.test"));
delete d->post(dummy, multiPart);
return d->m_data;
}

#include "multipart.moc"

您还可以在这里找到一些单元测试: https://gitlab.com/accounts-sso/libauthentication/commit/7d84cb417f756e663dca7362457b28bc53a1096a

关于qt5 - QHttpMultiPart 到 QByteArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735745/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com