案例: 所有需要校验的数据全部在参数体中
代码:封装一个NetworkManager
#ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H
#include <QWidget>
#include <QNetworkAccessManager>
class NetworkManager : public QNetworkAccessManager
{
Q_OBJECT
public:
static NetworkManager &getInstance();
//QNetworkReply *get(QString url);
QNetworkReply *postObject(QString urlLoc,QMap<QString,QVariant> obj);
QNetworkReply *postFile(QString urlLoc,QString token,QString fileName,QString remoteFileName);
private:
explicit NetworkManager(QObject *parent = nullptr);
QString getBoundary();
static NetworkManager smInstance;
signals:
public slots:
};
#endif // NETWORKMANAGER_H
#include "networkmanager.h"
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QDebug>
#include <QLoggingCategory>
#include <QFileInfo>
#include <QHttpMultiPart>
#include <QMimeDatabase>
NetworkManager NetworkManager::smInstance;
NetworkManager &NetworkManager::getInstance()
{
return smInstance;
}
QString NetworkManager::getBoundary()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //随机种子
QString tmp;
// 48~122, '0'~'A'~'z'
for(int i = 0; i < 16; i++)
{
tmp[i] = qrand() % (122-48) + 48;
}
//cout << "tmp = " << tmp;
return QString("------WebKitFormBoundary%1").arg(tmp);
}
QNetworkReply *NetworkManager::postObject(QString urlLoc,QMap<QString, QVariant> obj)
{
QNetworkRequest request;
request.setUrl(QUrl(urlLoc));
/*
------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; token="xxxx"; filename="aaaaaa.txt"\r\n
Content-Type: image/png\r\n
\r\n
真正的文件内容\r\n
------WebKitFormBoundary88asdgewtgewx
*/
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
//自动根据文件类型来算出数据的MIME类型,比如text/plain application/json
//filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
// QMimeDatabase mimeDb;
//QMimeType mimeType = mimeDb.mimeTypeForFile(fileName);
//filePart.setHeader(QNetworkRequest::ContentTypeHeader, mimeType.name());
//filePart.setHeader(QNetworkRequest::ContentDispositionHeader,QString("form-data;filename=\"%1\"").arg(remoteFileName));
QHttpPart code;
code.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data;name=\"code\""));
code.setBody(QString("BT106002012AHRN201209006").toLocal8Bit());
QHttpPart txn;
txn.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data;name=\"txnNo\""));
txn.setBody(QString("51653156456").toLocal8Bit());
//QString files = QString("form-data;name=\"f\";filename=\"%1\";").arg(remoteFileName);
// QHttpPart filePart;
// QFile *file = new QFile(fileName);
//file->open(QIODevice::ReadOnly);
// filePart.setBodyDevice(file);
// file->setParent(multiPart);
multiPart->append(code);
multiPart->append(txn);
return this->post(request,multiPart);
}
QNetworkReply *NetworkManager::postFile(QString urlLoc, QString token, QString fileName,QString remoteFileName)
{
QNetworkRequest request;
request.setUrl(QUrl(urlLoc));
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
//自动根据文件类型来算出数据的MIME类型,比如text/plain application/json
//filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
// QMimeDatabase mimeDb;
//QMimeType mimeType = mimeDb.mimeTypeForFile(fileName);
//filePart.setHeader(QNetworkRequest::ContentTypeHeader, mimeType.name());
//filePart.setHeader(QNetworkRequest::ContentDispositionHeader,QString("form-data;filename=\"%1\"").arg(remoteFileName));
QHttpPart code;
code.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data;name=\"code\""));
code.setBody(QString("BT106002012AHRN201209008").toLocal8Bit());
QHttpPart txn;
txn.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data;name=\"txnNo\""));
txn.setBody(QString("51653156456").toLocal8Bit());
QHttpPart sign;
sign.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data;name=\"sign\""));
sign.setBody(QString("dERuMYXAOHx89qENtNO5z0Ydt/epSbPHz6wY7lERlP1+8EQUVHVVE3rL3S9C26oMaDneBBk35wnlliQvWiKVqtXn0H02VzZ0zWG3jSuuwz8lag37Yaqnd9ytzr8sASSk7mDK6iVg2BjF7QeUWEITs7xYWGBkT3fm7yfMWvC+Xe0=").toLocal8Bit());
QString files = QString("form-data;name=\"files\";filename=\"%1\";").arg(remoteFileName);
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(files));
QFile *file = new QFile(fileName);
file->open(QIODevice::ReadOnly);
filePart.setBody(file->readAll());
multiPart->append(code);
multiPart->append(txn);
multiPart->append(sign);
multiPart->append(filePart);
multiPart->setParent(this);
return this->post(request,multiPart);
}
NetworkManager::NetworkManager(QObject *parent) : QNetworkAccessManager(parent)
{
}