Qt之QNetworkAccessManager 从本地和内存中上传数据到Http服务器

简述

        接连做了好几个服务器的项目,例如文件传输用的Ftp和对象存储服务器(Object Storage Service),简单的信息传输用的WebServer,之前也有用过HttpServer不过都和WebServer一样简单的调用接口提交数据并没有上传过文件,正好趁这次案例有机会做了个测试实例;

效果

从本地上传

        从本地中读取一个图片上传,图片的ContentTypeHeader头部信息要填写和图片格式一致的类型,例如:jpg对应"image/jpg",bmp对应"image/bmp",png对应"image/png";ContentDispositionHeader头部信息的name要对应"file";QFile需要动态创建,因为要上传的文件可能很大,如果是局部的话函数退出就会销毁内存,导致上传失误甚至程序奔溃;最后因为QFile是动态创建,所以需要给其设置一个父类QHttpMultiPart,当父类被删除时也删除QFile;

void MainWindow::on_pbFromLocal_clicked()
{obtainData();// 文件路径QFile *file = new QFile("C:/Users/ilson/Desktop/HttpFileUp/logo.jpg");if (!file->open(QFile::ReadOnly)) {statusBar()->showMessage("file open failed");return;}// 设置请求QHttpPart imagePart;imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpg"));imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\";filename=\"test.jpg\""));imagePart.setBodyDevice(file);QHttpPart codePart;codePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"productCode\""));codePart.setBody("code");QHttpPart addressPart;addressPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"macAddress\""));addressPart.setBody("A1:B2:C3:D4:E5:G6");//QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);multiPart->append(imagePart);multiPart->append(codePart);multiPart->append(addressPart);file->setParent(multiPart);  // 用 multiPart 删除 fileQNetworkReply *reply = m_http.post(QNetworkRequest(makeUrl()), multiPart);multiPart->setParent(reply); // 用 reply 删除 multiPartconnect(reply, SIGNAL(finished()), SLOT(replyFinished()));
}

从内存上传

        从内存上传和从本地的区别就是数据需要重新保存成QIODevice类型;

// 压缩图像
// image     要压缩的图像
QByteArray MainWindow::compim(const QImage &image)
{QBuffer buffer;buffer.open(QIODevice::WriteOnly);image.save(&buffer, "jpg", 90);buffer.close();return buffer.data();
}void MainWindow::on_pbFromMemory_clicked()
{obtainData();// 文件路径QImage image("C:/Users/ilson/Desktop/111.png");// 设置请求QHttpPart imagePart;imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\";filename=\"test.png\""));imagePart.setBody(compim(image));QHttpPart codePart;codePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"productCode\""));codePart.setBody("code");QHttpPart addressPart;addressPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"macAddress\""));addressPart.setBody("A1:B2:C3:D4:E5:G6");//QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);multiPart->append(imagePart);multiPart->append(codePart);multiPart->append(addressPart);QNetworkReply *reply = m_http.post(QNetworkRequest(makeUrl()), multiPart);multiPart->setParent(reply); // 用 reply 删除 multiPartconnect(reply, SIGNAL(finished()), SLOT(replyFinished()));
}

注意 

        QHttpMultiPart的删除需要给其设置父类QNetworkReply,当QNetworkReply被删除时其子类也自会删除;

其他

        源码下载(折扣):https://item.taobao.com/item.htm?ft=t&id=756129976580

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣LCR 130. 衣橱整理(DFS 解法)

Problem: LCR 130. 衣橱整理 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 首先该问题可以归纳为一类遍历二维矩阵的题目,此类中的一部分题目可以利用DFS来解决,具体到本题目: 我们可以利用一个布尔类型的二维数组记录我们已经访…

no module named ‘xxx‘

目录结构如下 我想在GCNmodel的model里引入layers的GraphConvolution:from GCNmodel.layers import GraphConvolution,但这样却报错no module named GCNmodel,而且用from layers import GraphConvolution也不行。然后用sys.path.appen(xxx)…

selenium-grid4.3.0两种模式记录

selenium-grid4.3.0两种模式记录 本文运行,需要提前配置好Java11以及安装好Chrom、Firefox、Safari其中一个浏览器,如果是Chrom、Firefox需要下载对应版本的驱动,并给 webdriver 配置环境变量,Safari浏览器Mac系统会自带&#xf…

使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug 硬件要求配置方法代码要求打印输出结果 硬件要求 STM32的PB9、PB10引脚的串口1通常用作其他功能使用后,无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。 ST…

Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11

MacOS通过PD安装Win11 下载ParallelsDesktop安装ParallelsDesktop激活ParallelsDesktop下载Windows11安装Windows11激活Windows11 下载ParallelsDesktop ParallelsDesktop下载地址 安装ParallelsDesktop 关闭上面的窗口,继续操作 激活ParallelsDesktop 关闭上面的…

【LeetCode刷题】-- 161.相隔为1的编辑距离

161.相隔为1的编辑距离 方法:一次遍历 首先,我们要确认字符串的长度不会相差太远。如果长度差了2个或更多字符,那么 s 和 t 就不可能是一次编辑之差的字符串。 接下来,我们假设 s 的长度总是短于或等于 t 的长度。如果不是这样&…

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来 一、模型介绍 1、模型简介 季节性差分自回归移动平均模型(Seasonal Autoregressive Integrated Moving Average Model, SARIMA),又称为周期性…

uniapp的uni-im 即时通信使用教程【用户与商家对话、聊天 / 最新 / 最全 / 带源码 / 教程】

目录 使用场景用户图片商家图片 官方文档官方文档地址插件地址 项目创建uniCloud开发环境申请开发环境申请完后 概括开始使用步骤1App.vue 步骤2找到软件登录图片找到软件登录接口登录源码如下 步骤3找到软件注册图片注册源码如下 步骤4找到index.vue首页图片 index.vue源码如下…

佛山IBM System x3550 M4服务器维修检查

案例背景: 一家位于东莞的制造公司,在其佛山分厂中安装了一台IBM X3550 M4服务器作为其关键业务设备。该服务器负责管理和存储公司的生产数据、ERP系统和供应链数据。在生产过程中,该服务器突然发生了故障,导致佛山分厂的生产中断…

LT7911D是TYPE-C/DP或者EDP转2 PORT MIPI和LVDS加音频

1.概述: T7911D是一款高性能TYPE-C/DP/EDP转2 PORT MIPI或者LVDS的芯片,目前主要在AR/VR或者显示器上应用的很多,对于DP1.2输入,LT7911D可配置为1/2/4车道。自适应均衡化使其适用于长电缆应用,最大带宽可达21.6Gbps。…

编译android的C版本Lua库

本文讲述如何使用android studio 编译最新版本的Lua开源库),请自行下载。 我们提供的Demo,可以自行下载,工程结构如下: 本文编译的是Lua 5.4.6的版本,编译采用cmake的方式,我们支持编译静态库和动态库(我们在这一讲里:“Lua与***C在Android上的互调”是使用静态库)…

管理类联考——数学——真题篇——按知识分类——几何——解析几何

文章目录 解析几何2023真题(2023-07)-几何-解析几何-最值-画图求最值-两线相减求最大-联想三角形的“两边差小于第三边”,当为第三边为最大真题(2023-19)-几何-解析几何-最值-画图求最值-圆方程画出圆的形状-两点间距离…

自动驾驶学习笔记(十九)——Planning模块

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 Planning作用 Planning内容 Plannin…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头?总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进,慢慢来哈哈哈哈哈哈…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装,主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

计算机毕业设计 基于SpringBoot的二手物品交易管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

git代码管理学习文档

1.版本控制 每一版本都会发生变化 更新版本,回退版本 版本控制实际就是控制文件的变化 服务器端和每个人的电脑上都会记录版本的变化,也就是说整个团队都记录了版本的变化。 不需要连网,他是分布式的,在自己电脑上也可以操作。 …

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 ,操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

《PySpark大数据分析实战》-12.Spark on YARN配置Spark运行在YARN上

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

Rabbitmq消息重复消费问题(幂等性保障)

消息百分百投递架构 在《消息可靠性保证》篇章中,我通过生产者确认机制保障了消息会发送到MQ中,但是在生产者与MQ建立过程的时候出现了网络抖动,连接建立失败,生产者就感知不到MQ返回的ack/nack,无法完全保障消息投递…