Qt使用QHttpMultiPart发送文件的方法
时间:2019-08-22
本文章向大家介绍Qt使用QHttpMultiPart发送文件的方法,主要包括Qt使用QHttpMultiPart发送文件的方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
由于之前没怎么接触过http方面的编程,对这方面并不了解,前一阵项目中用到了上传图像到服务器的功能,便研究了一下上传的方法
在上传图像时用到了提交表单的方法。
QNetworkRequest request;
//request初始化
//发送multi part内容时,不能设置下面一句,否则服务端无法解析边界
//request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
QFile* file = new QFile(path);
file->open(QIODevice::ReadOnly);
QHttpMultiPart *multi_part = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart image_part;
image_part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpg"));
image_part.setHeader(QNetworkRequest::ContentDispositionHeader
, QVariant(QString("form-data; name=\"file\";filename=\"testfile.jpg\";"));
image_part.setBodyDevice(file);
multi_part->append(image_part);
QNetworkReply *reply = manager_.post(request, multi_part);
在这里面需要注意的是,一方面是request不需要设置ContentTypeHeader,另一方面是在QHttpPart的ContentTypeHeader中,要设置对应的图像格式,如果是png,则按照以下方式设置
image_part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));
最近,项目中又涉及到上传文件,即类型不止有图像,而且还需要附加数据(比如说userId="999")一起发送到服务器。查询到Qt助手中的例子是上传图像的,而网上找到的例子也清一色全是基于图像的,并没有地方说明了用什么来替代QVariant("image/png")
,由于对Http又几乎是一窍不通,我也不清楚该如何附带数据在消息上。
通过对表单的分析("form-data"),以及尝试,终于找到了方法,一方面,对于文件可以不设置ContentTypeHeader
,另一方面,新建一个Part用于存储数据。
QNetworkRequest request;
//request初始化
//发送multi part内容时,不能设置下面一句,否则服务端无法解析边界
//request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
QFile* file = new QFile(path);
file->open(QIODevice::ReadOnly);
QHttpMultiPart *multi_part = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart image_part;
//下面一句不是必要的
//image_part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpg"));
image_part.setHeader(QNetworkRequest::ContentDispositionHeader
, QVariant(QString("form-data; name=\"file\";filename=\"testfile.txt\";"));
image_part.setBodyDevice(file);
multi_part->append(image_part);
QHttpPart data_part;
data_part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
//在name属性中设置域名,在这里是userId
data_part.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"userId\""));
//在body体中设置值,在这里是999
data_part.setBody("999");
multi_part->append(data_part);
QNetworkReply *reply = manager_.post(request, multi_part);
至于下面这句为什么可有可无,我并没有弄得十分清楚,还麻烦明白的朋友指点一下。
image_part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpg"));\
原文地址:https://www.cnblogs.com/AlainGao/p/11396593.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Intel OpenCL 之 Pipeline(二)For循环的执行机制
- Intel OpenCL 之 Pipeline(三)不能pipeline的可能情况
- Intel OpenCL 之 Pipeline(四):Pipeline不理想的几种情况
- Python数据分析之NumPy(基础篇)
- Python数据分析之NumPy(运算篇)
- Python数据分析之NumPy(高级篇)
- Python数据分析之Pandas(数据结构)
- Python数据分析之Pandas(数据操作)
- Python数据分析之Seaborn(样式风格)
- Python数据分析之Seaborn(配色方案)
- Python数据分析之Seaborn(变量分析绘图)
- Python数据分析之Seaborn(回归分析绘图)
- Python数据分析之Seaborn(分类分析绘图 )
- Python数据分析之Seaborn(热图绘制)
- Python数据分析之matplotlib(3D绘图)