返回顶部
首页 > 资讯 > 精选 >Qt怎么用QNetwork实现上传数据
  • 212
分享到

Qt怎么用QNetwork实现上传数据

2023-07-05 06:07:50 212人浏览 泡泡鱼
摘要

这篇文章主要介绍了Qt怎么用QNetwork实现上传数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么用QNetwork实现上传数据文章都会有所收获,下面我们一起来看看吧。1、利用Qt提供的类实现向服务

这篇文章主要介绍了Qt怎么用QNetwork实现上传数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么用QNetwork实现上传数据文章都会有所收获,下面我们一起来看看吧。

1、利用Qt提供的类实现向服务器发送post和get请求

#include <QCoreApplication>#include <QNetworkAcceSSManager>#include <QNetworkRequest>#include <QNetworkReply>#include <QJSONArray>#include <QjsonDocument>#include <QJsonObject>#include <QJsonParseError>#include <QJsonValue>#include <QString>#include <QDebug>#include <QFile>#include <QDateTime>#include <QDir>#include <QThread>#pragma execution_character_set("utf-8")void sendPostRequest(){    QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();    //设置url    QString url = "http://localhost:80/post";    //设置头信息    QNetworkRequest requestInfo;    requestInfo.setUrl(QUrl(url));    requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));    //requestInfo.setRawHeader("Content-Type","application/json");//服务器要求的数据头部    //requestInfo.setRawHeader("Accept","text/json,*, const QString& strExContentDisposition )    {        m_pData = nullptr;        m_nDataLen = 0;        m_sName = strName;        m_sValue = strValue;        m_sContentType = strContentType;        m_sExContentDisposition = strExContentDisposition;    }    CMultiPartItem::CMultiPartItem(const QString& strName, void* pData, int nLen,        const QString& strContentType , const QString& strExContentDisposition )    {        m_pData = pData;        m_nDataLen = nLen;        m_sName = strName;        m_sContentType = strContentType;        m_sExContentDisposition = strExContentDisposition;    }    //    bool HttpGet(        const HttpRequestData& data,        QByteArray& respData,        int nTimeoutmsec ,        QString& errMsg,        int* pStatuCode )    {        // Assemble Url        QString strUrl = data.strUrl;        if (!data.strServer.isEmpty())            strUrl = data.strServer + ":" + QString::number(data.nPort) + "/" + data.strUrl;        const QUrl url = QUrl::fromUserInput(strUrl);        // Send Get Requeset        QNetworkRequest request(url);        for (auto iter = data.mapHeaders.begin(); iter != data.mapHeaders.end(); iter++)        {            request.setHeader(iter->first, iter->second);        }        QNetworkAccessManager qNetAccessManager;        QNetworkReply* reply = qNetAccessManager.get(request);        if (reply == nullptr)            return false;        // Set time out        QTimer timer;        timer.setInterval(nTimeoutmsec);    // 设置超时时间 30 秒        timer.setSingleShot(true);          // 单次触发        // Set Loop Event        QEventLoop eventLoop;        QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);        QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);        timer.start();        int eRes = eventLoop.exec(QEventLoop::ExcludeUserInputEvents);        bool bResult = false;        if (timer.isActive())        {            timer.stop();            QNetworkReply::NetworkError replyError = reply->error();            QVariant variant = reply->attribute(QNetworkRequest::httpstatusCodeAttribute);            int nStatusCode = variant.toInt();            if (nullptr != pStatuCode)            {                *pStatuCode = nStatusCode;            }            if (replyError != QNetworkReply::NoError)            {                errMsg = reply->errorString();                qDebug() << "Error String : " << errMsg << "\n";            }            else            {                if (nStatusCode == 200)                {                    // Accept Response                    respData = reply->readAll();                    bResult = true;                }                else                {                    bResult = false;                }            }        }        else        {            QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);            reply->abort();            qDebug() << strUrl << ":Timeout\n";        }        reply->deleteLater();        reply = nullptr;        return bResult;    }    bool HttpPost(const HttpRequestData &data, QByteArray &respData, QString &errMsg, int nTimeoutmsec)    {        // Assemble Url        QString strUrl = data.strUrl;        if (!data.strServer.isEmpty())            strUrl = data.strServer + ":" + QString::number(data.nPort) + "/" + data.strUrl;        const QUrl url = QUrl::fromUserInput(strUrl);        // Send Post Requeset        QNetworkRequest request(url);        for (auto iter = data.mapHeaders.begin(); iter != data.mapHeaders.end(); iter++)        {            request.setHeader(iter->first, iter->second);        }        QNetworkAccessManager qNetAccessManager;        QNetworkReply* reply = qNetAccessManager.post(request, data.bytePostData);        if (reply == nullptr)            return false;        // Set time out        QTimer timer;        timer.setInterval(nTimeoutmsec);    // 设置超时时间 30 秒        timer.setSingleShot(true);          // 单次触发        // Set Loop Event        QEventLoop eventLoop;        QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);        QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);        timer.start();        eventLoop.exec(QEventLoop::ExcludeUserInputEvents);        bool bResult = false;        if (timer.isActive())        {            timer.stop();            QNetworkReply::NetworkError replyError = reply->error();            if (replyError != QNetworkReply::NoError)            {                errMsg = reply->errorString();                qDebug() << "Error String : " << reply->errorString() << "\n";            }            else            {                QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);                int nStatusCode = variant.toInt();                if (nStatusCode == 200)                {                    // Accept Response                    respData = reply->readAll();                    bResult = true;                }            }        }        else        {            QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);            reply->abort();            errMsg = (strUrl + ":Timeout\n");            qDebug() << strUrl << ":Timeout\n";        }        reply->deleteLater();        reply = nullptr;        return bResult;    }    bool UploadMultipartData(const HttpRequestData &data, const CMultiPartDatas &multiPartDatas, QByteArray &respData, QString &errMsg, int nTimeoutmsec)    {        QString strUrl = data.strUrl;        if (!data.strServer.isEmpty())            strUrl = data.strServer + ":" + QString::number(data.nPort) + "/" + data.strUrl;        const QUrl url = QUrl::fromUserInput(strUrl);        // 创建网络请求        QNetworkRequest request;        request.setUrl(url);        QHttpMultiPart httpMultiPart(QHttpMultiPart::FORMDataType);        // 解决Qt自动解析MultiPart得到boundary=带双引号问题        for (auto iter = data.mapHeaders.begin(); iter != data.mapHeaders.end(); iter++)        {            request.setHeader(iter->first, iter->second);        }        request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data;boundary=" + httpMultiPart.boundary());        FOR_EACH(itemPart, multiPartDatas)        {            QHttpPart httpPart;            {                QString strContentDisposition = QString("form-data; name=\"%1\"%2").arg(itemPart.m_sName)                    .arg(itemPart.m_sExContentDisposition.isEmpty() ? "" : "; " + itemPart.m_sExContentDisposition);                httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, strContentDisposition.toUtf8());                if (itemPart.m_sContentType.isEmpty() == false)                {                    httpPart.setHeader(QNetworkRequest::ContentTypeHeader, itemPart.m_sContentType.toUtf8());                }                if (itemPart.m_pData)                {                    httpPart.setBody(QByteArray((const char*)itemPart.m_pData, itemPart.m_nDataLen));                }                else                {                    httpPart.setBody(itemPart.m_sValue.toUtf8());                }            }            httpMultiPart.append(httpPart);        }        QNetworkAccessManager qNetAccessManager;        QNetworkReply* reply = qNetAccessManager.post(request, &httpMultiPart);        if (reply == nullptr)        {            errMsg = QObject::tr("发送失败");            return false;        }        QList<QByteArray> headers = reply->rawHeaderList();        // Set time out        QTimer timer;        timer.setInterval(nTimeoutmsec);    // 设置超时时间 30 秒        timer.setSingleShot(true);          // 单次触发        // Set Loop Event        QEventLoop eventLoop;        QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);        QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);        timer.start();        eventLoop.exec(QEventLoop::ExcludeUserInputEvents);        bool bResult = false;        if (timer.isActive())        {            timer.stop();            QNetworkReply::NetworkError replyError = reply->error();            if (replyError != QNetworkReply::NoError)            {                errMsg = reply->errorString();                qDebug() << "Error String : " << reply->errorString() << "\n";            }            else            {                QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);                int nStatusCode = variant.toInt();                if (nStatusCode == 200)                {                    // Accept Response                    respData = reply->readAll();                    bResult = true;                }            }        }        else        {            QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);            reply->abort();            qDebug() << data.strUrl << ":Timeout\n";        }        reply->deleteLater();        reply = nullptr;        return bResult;    }    bool UploadMultipartData(const QString &strURL, const CMultiPartDatas &multiPartDatas, QByteArray &respData, QString &errMsg, int nTimeoutmsec)    {        // 创建网络请求        QNetworkRequest request;        request.setUrl(QUrl::fromUserInput(strURL));        QHttpMultiPart httpMultiPart(QHttpMultiPart::FormDataType);        // 解决Qt自动解析MultiPart得到boundary=带双引号问题        request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data;boundary=" + httpMultiPart.boundary());        foreach (itemPart, multiPartDatas)        {            QHttpPart httpPart;            {                QString strContentDisposition = QString("form-data; name=\"%1\"%2").arg(itemPart.m_sName)                    .arg(itemPart.m_sExContentDisposition.isEmpty() ? "" : "; " + itemPart.m_sExContentDisposition);                httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, strContentDisposition.toUtf8());                if (itemPart.m_sContentType.isEmpty() == false)                {                    httpPart.setHeader(QNetworkRequest::ContentTypeHeader, itemPart.m_sContentType.toUtf8());                }                if (itemPart.m_pData)                {                    httpPart.setBody(QByteArray((const char*)itemPart.m_pData, itemPart.m_nDataLen));                }                else                {                    httpPart.setBody(itemPart.m_sValue.toUtf8());                }            }            httpMultiPart.append(httpPart);        }        QNetworkAccessManager qNetAccessManager;        QNetworkReply* reply = qNetAccessManager.post(request, &httpMultiPart);        if (reply == nullptr)        {            errMsg = QObject::tr("发送失败");            return false;        }        QList<QByteArray> headers = reply->rawHeaderList();        // Set time out        QTimer timer;        timer.setInterval(nTimeoutmsec);    // 设置超时时间 30 秒        timer.setSingleShot(true);          // 单次触发        // Set Loop Event        QEventLoop eventLoop;        QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);        QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);        timer.start();        eventLoop.exec(QEventLoop::ExcludeUserInputEvents);        bool bResult = false;        if (timer.isActive())        {            timer.stop();            QNetworkReply::NetworkError replyError = reply->error();            if (replyError != QNetworkReply::NoError)            {                errMsg = reply->errorString();                qDebug() << "Error String : " << reply->errorString() << "\n";            }            else            {                QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);                int nStatusCode = variant.toInt();                if (nStatusCode == 200)                {                    // Accept Response                    respData = reply->readAll();                    bResult = true;                }            }        }        else        {            QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);            reply->abort();            qDebug() << strURL << ":Timeout\n";        }        reply->deleteLater();        reply = nullptr;        return bResult;    }}

关于“Qt怎么用QNetwork实现上传数据”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Qt怎么用QNetwork实现上传数据”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Qt怎么用QNetwork实现上传数据

本文链接: https://lsjlt.com/news/349885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Qt怎么用QNetwork实现上传数据
    这篇文章主要介绍了Qt怎么用QNetwork实现上传数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么用QNetwork实现上传数据文章都会有所收获,下面我们一起来看看吧。1、利用Qt提供的类实现向服务...
    99+
    2023-07-05
  • Qt利用QNetwork实现上传数据的示例代码
    目录1、利用Qt提供的类实现向服务器发送post和get请求2、实现文件上传1、利用Qt提供的类实现向服务器发送post和get请求 #include <QCoreApplic...
    99+
    2023-02-24
    Qt QNetwork实现上传数据 Qt QNetwork上传数据 Qt QNetwork
  • django怎么实现数据上传到数据库
    Django提供了多种方法将数据上传到数据库,以下是其中的一种常用方法:1. 定义数据库模型:首先需要在models.py文件中定义...
    99+
    2023-09-26
    django 数据库
  • 怎么用python requests实现上传excel数据流
    本篇内容主要讲解“怎么用python requests实现上传excel数据流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用python requests实现上传exc...
    99+
    2023-06-29
  • qt怎么调用java接口传取数据
    在Qt中调用Java接口可以通过Qt的Java Native Interface (JNI)来实现。以下是一个简单的示例,演示了如何...
    99+
    2023-09-22
    QT Java
  • Qt怎么实现通用数据库同步
    这篇文章主要介绍“Qt怎么实现通用数据库同步”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Qt怎么实现通用数据库同步”文章能帮助大家解决问题。一、前言数据库同步的主要功能是将本地的数据库记录同步到远...
    99+
    2023-06-29
  • Qt怎么实现数据导出到xls
    本篇内容介绍了“Qt怎么实现数据导出到xls”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言导入导出数据到csv由于语法简单,适用场景...
    99+
    2023-06-26
  • python requests实现上传excel数据流
    目录requests上传excel数据流数据驱动之python+requests+excel数据驱动1. 首先设计好测试用例2.建立文件结构3.封装模块4.配置文件5.将ATP文件6...
    99+
    2024-04-02
  • Qt数据库应用之怎么实现图片转pdf
    本篇内容介绍了“Qt数据库应用之怎么实现图片转pdf”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果图五、相关代码void Da...
    99+
    2023-06-30
  • qt怎么上传文件到服务器
    在Qt中上传文件到服务器可以通过使用QNetworkAccessManager和QNetworkRequest来实现。以下是一个简单...
    99+
    2024-03-06
    qt 服务器
  • 怎么用Springboot+vue实现图片上传至数据库并显示
    今天小编给大家分享一下怎么用Springboot+vue实现图片上传至数据库并显示的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-06
  • qt怎么下载服务器上的数据
    要下载服务器上的数据,你可以使用Qt的网络模块来进行网络请求。以下是一个简单的示例代码,可以帮助你下载服务器上的数据: #inclu...
    99+
    2024-03-06
    qt 服务器
  • 怎么用php实现图片上传
    这篇文章主要介绍了怎么用php实现图片上传的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用php实现图片上传文章都会有所收获,下面我们一起来看看吧。一、创建html页面首先,我们要创建一个html页面,这个...
    99+
    2023-07-05
  • 怎么用jQuery AJAX实现后台传数据
    这篇文章主要介绍了怎么用jQuery AJAX实现后台传数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用jQuery AJAX实现后台传数据文章都会有所收获,下面我们一...
    99+
    2024-04-02
  • Node.Js怎么实现sendfile数据传输
    本篇内容主要讲解“Node.Js怎么实现sendfile数据传输”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.Js怎么实现sendfile数据传输”吧!首先我们看一下sendfile的...
    99+
    2023-07-04
  • qt多线程处理大量数据怎么实现
    在Qt中,可以使用QThread来实现多线程处理大量数据。首先,创建一个继承自QThread的自定义线程类,重写其run()函数,将...
    99+
    2023-10-18
    qt
  • Qt数据库应用之实现通用数据库清理
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 很多项目如果需要存储很多日志记录比如运行日志,时间长了记录数量非常多,数据库体积不断增大,对应数据库表的增删改查的...
    99+
    2024-04-02
  • Qt数据库应用之实现通用数据生成器
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 有两种应用场景需要用到数据生成器,一种是需要测试数据库性能,比如在100万条和1000万条记录的时候对比查询或更新...
    99+
    2024-04-02
  • Qt数据库应用之实现通用数据库分页
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 数据库分页展示,在所有的涉及到数据库记录的项目中都是需要的,除了简单的设备信息表、用户信息表这种很少几条几十条数据...
    99+
    2024-04-02
  • Qt数据库应用之实现通用数据库采集
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 数据库采集对应的就是上一篇文章的数据库同步,数据库同步到云端数据库以后,app、网页、小程序啥的要数据的话,可以通...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作