QT模拟表单上传文件到微信服务器
最近做微信开发,需要上传素材到微信服务器,我就用qt写了一个界面上传素材,首先我们来看下最终的界面:
然后将里面的access_token后面的lineEdit命名为:accessMediaEdit,type后面的ComboBox命名为typeComboBox,filePath后面的lineEdit命名为:fileMediaEdit,浏览按钮命名为fileMediaBtn,result后面TextEdit命名为:mediaTextEdit,upload按钮命名为:uploadMediaBtn,好了,现在上传临时多媒体文件这一模块的界面已经弄好了,接下来看代码实现,
upload按钮连接的槽:
void Widget::on_uploadMedia_slot() {QString url = MEDIA_URL;QString type = ui->typeComboBox->currentText();url.replace(QRegularExpression("ACCESS_TOKEN"), QString(ui->accessMediaEdit->text())).replace(QRegularExpression("TYPE"), type);AppUtil::getInstance()->httpRequest(url, NULL, ui->fileMediaEdit->text(), "media");}
这上面是upload按钮所触发的槽,接下来我一个解释,前面几行是获数据,然后有一行代码:
url.replace(QRegularExpression(“ACCESS_TOKEN”), QString(ui->accessMediaEdit->text())).replace(QRegularExpression(“TYPE”), type);
这一行代码是上传临时多媒体的api,它的地址为:
#define MEDIA_URL "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
然后我们来看看AppUtil::getInstance()->httpRequest(url, NULL, ui->fileMediaEdit->text(), “media”);这个方法的定义:
void AppUtil::httpRequest(QString url, QString type, QString filePath, QString flag)
{
qDebug() << "httpRequest---strat";if( !mNetManager ) {mNetManager = new QNetworkAccessManager(this);}this->flag = flag;QFile file(filePath);if(file.exists()) {if( !file.open(QIODevice::ReadOnly)) {QMessageBox::warning(NULL, QObject::tr("warning"), QObject::tr("打开传输的文件失败"), QMessageBox::Yes);return;}}//读取所有文件QByteArray fileContent = file.readAll();//边界的时候这里加两杠QString boundary = "----weasdashDsdesd";//起始边界QString startBoundary = "--" + boundary;//结束边界QString endBoundary = "\r\n--" + boundary + "--\r\n";//设置传输类型QString qContentType = "multipart/form-data; boundary=" + boundary;//要发送的内容QByteArray content;QString tempStr = startBoundary;tempStr += "\r\nContent-Disposition: form-data; name=\"media\"; filename=\""+getExt(file)+"\"\r\n";tempStr += "Content-Type: " + getType(file) + "\r\n\r\n";content.append(tempStr.toLatin1());content.append(fileContent);content.append(endBoundary);//构造http请求QNetworkRequest req;QSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::TlsV1SslV3);req.setSslConfiguration(config);req.setUrl(QUrl(url));req.setHeader(QNetworkRequest::ContentTypeHeader, qContentType.toLatin1());QNetworkReply * reply = mNetManager->post(req, content);connect(mNetManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(on_seccess_slot(QNetworkReply *)));}
这个方法是模拟multipart/form-data格式的表单上传数据,我们来看看这种数据的格式是怎样的:
http协议请求头
http协议请求体
看到上面的两张图,就是我们需要模仿的内容。
QSslConfiguration config;
config.setPeerVerifyMode(QSslSocket::VerifyNone);
config.setProtocol(QSsl::TlsV1SslV3);
这三行代码是设置该请求能够发动https请求,然而,qt本身并不带https请求,如果需要让qt支持https请求,需要自己另外下载东西,我就不赘述了,具体的可以参考这篇博客QSslSocket解决办法需要注意的是,你下载的库一定要要对应你安装的Qt creator版本,而不是对应你的操作系统版本,例如你的操作系统是64位,但是你的qt creator安装的却是32位,那么你安装的应该是32位而不是64位。
req.setSslConfiguration(config);
req.setUrl(QUrl(url));
req.setHeader(QNetworkRequest::ContentTypeHeader, qContentType.toLatin1());
QNetworkReply * reply = mNetManager->post(req, content);
这几行代码就不用多说了,只是正常的发动post请求,最后这一行
connect(mNetManager, SIGNAL(finished(QNetworkReply )), this, SLOT(on_seccess_slot(QNetworkReply )));这是连接信号与槽,
一旦服务器将所有的信息都发送回来,那么QNetworkAccessManager就会发射一个finished(QNetworkReply *)信号,然后我们就可以通过这个信号读取服务器的响应了。这个是qt上传临时多媒体的过程,至于这里面的其他功能比较类似,我就不去赘述了,只要理解我这里介绍的内容,其他的功能照样可以自己写出来。
源码下载:点我下载
QT模拟表单上传文件到微信服务器相关推荐
- PHP curl模拟表单上传文件 微信公众号素材管理接口crul文件上传核心源码
PHP curl模拟表单上传文件 微信公众号素材管理接口crul文件上传核心源码 /*** curl 上传文件* @param $url* @param $filePath* @param stri ...
- 七牛云上传文件之表单上传文件
本人愚钝,七牛云上传文件的开发说明文档看了好久才搞懂,才能完成一个实例跑起来.现在做一下总结. 1.注册七牛,新建一个bucket,并获得ak,sk这个不用说了.不涉及到程序编码,重点讲一下编码的流程 ...
- php无表单上传文件,php – 如何使用没有实体类的表单上传文件
我试图使用没有实体类的表单上传文件.到目前为止没有运气. // Controller public function uploadAction() { $request = $this->get ...
- php文件上传并保存路径到数据库,thinkphp表单上传文件并将文件路径保存到数据库中?...
上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` ( `id` int(11) ...
- android multipartentity 怎么上传参数,android-通过MultipartEntityBuilder通过HTTP表单上传文件,并显示进度b...
android-通过MultipartEntityBuilder通过HTTP表单上传文件,并显示进度b 短版本-.jar已弃用,其升级版本java.lang.NoClassDefFoundError在 ...
- form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?
今天我们要说的这个话题很简单,不要问为啥,因为SpringBoot,哈哈.现在SpringBoot可以说人人都会用了,它的好处是显而易见的,大大的简化了配置,一起来看看吧. 我们分以下3种情况来谈这个 ...
- php处理表单上传文件
使用表单上传文件的时候,表单的提交方式必须是post提交方式,上传文件的input控件type属性值应为file,最重要的是form标签需要加一个enctype="multipart/for ...
- serverlet 原理_serverlet实现表单上传文件原理
("/home/jh/upload/request.txt"); PrintWriter fileout = new PrintWriter(new FileWriter(f)); ...
- javaweb开发之处理表单上传文件和文件下载
2019独角兽企业重金招聘Python工程师标准>>> 一.基于表单的上传文件 1. enctype属性 当表单需要上传文件时,需指定表单 enctype 的值为 multipart ...
最新文章
- 【 MATLAB 】信号处理工具箱的信号产生函数之 square 函数简记
- iOS UI基础-11.0 UINavigationController
- 通过邮箱验证注册——.net代码
- 吴恩达深度学习笔记1-Course1-Week1【深度学习概论】
- IntelliJ IDEA 问题总结之二 —— 快捷键、主题样式、导出jar、sqlite
- 编写高效的PyTorch代码技巧(下)
- Java简单记事本设计实验报告_java记事本实验报告
- resultAPI示例
- 百度DuerOS与高通合推手机语音交互解决方案,谁会欢喜谁要愁?
- SpringCloud集成分布式事务LCN (一)
- 29-基于单片机的防盗报警系统仿真
- 航天晨光:永中DCS与原有OA系统整合,文件阅览效率大幅提升!
- 非洲做项目的务实与务虚
- 道德与企业成败 【如何搞垮一个企业.序】
- 洞察科技,感知未来:人工智能将如何改变学术搜索?
- 从0到1搭建大数据平台之数据计算
- egg项目服务器部署,egg部署到服务器
- Odoo产品分析 (三) -- 人力资源板块(3) -- 休假管理(1)
- Python实验舱谢尔宾斯基三角形绘制教程
- 关于2021/12/17国内bing不能正常访问的解决方法。