广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt利用QNetwork实现上传数据的示例代码
  • 249
分享到

Qt利用QNetwork实现上传数据的示例代码

QtQNetwork实现上传数据QtQNetwork上传数据QtQNetwork 2023-02-24 08:02:44 249人浏览 独家记忆
摘要

目录1、利用Qt提供的类实现向服务器发送post和get请求2、实现文件上传1、利用Qt提供的类实现向服务器发送post和get请求 #include <QCoreApplic

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://www.lsjlt.com/news/197374.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt利用QNetwork实现上传数据的示例代码
    目录1、利用Qt提供的类实现向服务器发送post和get请求2、实现文件上传1、利用Qt提供的类实现向服务器发送post和get请求 #include <QCoreApplic...
    99+
    2023-02-24
    Qt QNetwork实现上传数据 Qt QNetwork上传数据 Qt QNetwork
  • Qt怎么用QNetwork实现上传数据
    这篇文章主要介绍了Qt怎么用QNetwork实现上传数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么用QNetwork实现上传数据文章都会有所收获,下面我们一起来看看吧。1、利用Qt提供的类实现向服务...
    99+
    2023-07-05
  • Qt实现数据导出到xls的示例代码
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 导入导出数据到csv由于语法简单,适用场景有限,于是乎还是必须再造一个轮子导出数据到xls,在经历过数十年的项目实...
    99+
    2022-11-12
  • 利用Qt实现可扩展对话框的示例代码
    目录一、项目介绍二、项目基本配置三、UI界面设计四、主程序实现4.1 dialog.h头文件4.2 dialog.cpp源文件五、效果演示可扩展对话框通常用于用户对界面有不同要求的场...
    99+
    2022-11-13
  • Nodejs实现文件上传的示例代码
    笔者用nodejs做项目时需要用到文件上传的功能,在网上搜索了很多教程,找到了一个express的中间件,用于处理 multipart/form-data 类型的表单数据,可以很方便的将表单中的文件数据保存...
    99+
    2022-06-04
    示例 文件上传 代码
  • Qt实现边加载数据边显示页面的示例代码
    目录1.定义显示定时器1:定义定时器2:定时器调用3:定时器加载数据2.线程加载数据3.实时呈现加载进度做过C++开发的人们都知道,无论是MFC框架还是QT框架,实现加载数据的等待效...
    99+
    2022-11-13
  • Golang实现图片上传功能的示例代码
    目录1.前端代码2.JS代码3.后端代码该代码为使用beego实现前后端图片上传。话不多说,直接上代码。 1.前端代码 html代码: <div class="col-5 f...
    99+
    2022-11-13
  • springboot实现分段上传功能的示例代码
    目录文件上传下载导入依赖前端配置前端上传数据断点续传[增量上传]分片下载分片下载分片下载合并文件上传下载 断点续传,增量上传等 导入依赖 <!--jdk提供的关于文件上传--&...
    99+
    2022-11-13
  • GO语言实现文件上传的示例代码
    目录前言文件上传表单操作服务端操作流程实现小结前言 最近在写一个文件上传的功能,现在来进行整理总结一下go语言如何上传文件的,本文主要分享一下golang实现文件上传的流程和具体代码...
    99+
    2022-11-11
  • SpringCloudFeign实现文件上传下载的示例代码
    目录独立使用Feign上传文件下载文件使用Spring Cloud Feign上传文件下载文件总结 Feign框架对于文件上传消息体格式并没有做原生支持,需要集成模块fei...
    99+
    2022-11-13
  • Vue+NodeJS实现大文件上传的示例代码
    目录整体思路项目演示前端界面文件切片hash计算查询切片状态切片上传(断点续传)文件总体上传进度合并文件优化请求并发数控制hash值计算优化常见的文件上传方式可能就是new一个For...
    99+
    2022-11-13
  • Springboot实现图片上传功能的示例代码
    首先对图片进行UUID 防止图片被覆盖以及爬图 UUID的生成规则:日期时间,MAC地址,HashCode,随机数(多种之一) 开发上传接口,两处红字意思是生成文件夹和生成目标文件,...
    99+
    2022-11-13
  • JavaSpringBoot实现文件上传功能的示例代码
    测试代码 pom.xml: <xml version="1.0" encoding="UTF-8"> <project xmlns="http://maven.ap...
    99+
    2022-11-13
  • SpringMVC框架实现上传图片的示例代码
    一.创建图片虚拟目录在上传图片之前,先要设置虚拟目录(以IDEA为例) 打开工具栏的运行配置Edit Configurations 添加物理目录和并设置虚拟目录路径添加img图片在img文件夹内测试访问:http://localhost...
    99+
    2023-05-31
    spring mvc 上传
  • Go Gin实现文件上传下载的示例代码
    Go Gin 实现文件的上传下载流读取 文件上传 router router.POST("/resources/common/upload", service.Uploa...
    99+
    2022-06-07
    gin GO 示例 文件上传
  • React+react-dropzone+node.js实现图片上传的示例代码
    本文将会用typescript+react+react-dropzone+express.js实现前后端上传图片。当然是用typescript需要提前下载相应的模块,在这里就不依依介绍了。 第一步...
    99+
    2022-06-04
    示例 图片上传 代码
  • PHP实现文件上传和下载的示例代码
    目录1.效果图2.首先是封装好的图片类(缩放及生成水印)1.GDBasic.php2.Image.php3.ajax类封装文件1.index.php2.图片相关功能处理3.封装好的文...
    99+
    2022-11-13
  • Vue项目实现html5图片上传的示例代码
    目录图例1.选择图片2.预览图片2.1添加图片预览代码 两种方法的对比3.裁剪图片4.上传选择图片 -> 预览图片 -> 裁剪图片 -> 上传图片 我会以...
    99+
    2022-11-12
  • PHP+JS实现文件分块上传的示例代码
    目录一、分块上传流程二、实现代码HTMLJSPHP我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以...
    99+
    2022-11-13
    PHP JS文件分块上传 PHP 文件分块上传 PHP 文件上传
  • C/C++ Qt 数据库与ComBox实现多级联动示例代码
    Qt中的SQL数据库组件可以与ComBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,我们让其在另一个ComBox组件中列举出该用户所维护的...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作