QT中使用 http post 方式上传文件到服务器

20 篇文章 0 订阅

案例: 所有需要校验的数据全部在参数体中

代码:封装一个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)
{

}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值