最近做微信开发,需要上传素材到微信服务器,我就用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模拟表单上传文件到微信服务器相关推荐

  1. PHP curl模拟表单上传文件 微信公众号素材管理接口crul文件上传核心源码

    PHP curl模拟表单上传文件  微信公众号素材管理接口crul文件上传核心源码 /*** curl 上传文件* @param $url* @param $filePath* @param stri ...

  2. 七牛云上传文件之表单上传文件

    本人愚钝,七牛云上传文件的开发说明文档看了好久才搞懂,才能完成一个实例跑起来.现在做一下总结. 1.注册七牛,新建一个bucket,并获得ak,sk这个不用说了.不涉及到程序编码,重点讲一下编码的流程 ...

  3. php无表单上传文件,php – 如何使用没有实体类的表单上传文件

    我试图使用没有实体类的表单上传文件.到目前为止没有运气. // Controller public function uploadAction() { $request = $this->get ...

  4. php文件上传并保存路径到数据库,thinkphp表单上传文件并将文件路径保存到数据库中?...

    上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` (  `id` int(11) ...

  5. android multipartentity 怎么上传参数,android-通过MultipartEntityBuilder通过HTTP表单上传文件,并显示进度b...

    android-通过MultipartEntityBuilder通过HTTP表单上传文件,并显示进度b 短版本-.jar已弃用,其升级版本java.lang.NoClassDefFoundError在 ...

  6. form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?

    今天我们要说的这个话题很简单,不要问为啥,因为SpringBoot,哈哈.现在SpringBoot可以说人人都会用了,它的好处是显而易见的,大大的简化了配置,一起来看看吧. 我们分以下3种情况来谈这个 ...

  7. php处理表单上传文件

    使用表单上传文件的时候,表单的提交方式必须是post提交方式,上传文件的input控件type属性值应为file,最重要的是form标签需要加一个enctype="multipart/for ...

  8. serverlet 原理_serverlet实现表单上传文件原理

    ("/home/jh/upload/request.txt"); PrintWriter fileout = new PrintWriter(new FileWriter(f)); ...

  9. javaweb开发之处理表单上传文件和文件下载

    2019独角兽企业重金招聘Python工程师标准>>> 一.基于表单的上传文件 1. enctype属性 当表单需要上传文件时,需指定表单 enctype 的值为 multipart ...

最新文章

  1. 【 MATLAB 】信号处理工具箱的信号产生函数之 square 函数简记
  2. iOS UI基础-11.0 UINavigationController
  3. 通过邮箱验证注册——.net代码
  4. 吴恩达深度学习笔记1-Course1-Week1【深度学习概论】
  5. IntelliJ IDEA 问题总结之二 —— 快捷键、主题样式、导出jar、sqlite
  6. 编写高效的PyTorch代码技巧(下)
  7. Java简单记事本设计实验报告_java记事本实验报告
  8. resultAPI示例
  9. 百度DuerOS与高通合推手机语音交互解决方案,谁会欢喜谁要愁?
  10. SpringCloud集成分布式事务LCN (一)
  11. 29-基于单片机的防盗报警系统仿真
  12. 航天晨光:永中DCS与原有OA系统整合,文件阅览效率大幅提升!
  13. 非洲做项目的务实与务虚
  14. 道德与企业成败 【如何搞垮一个企业.序】
  15. 洞察科技,感知未来:人工智能将如何改变学术搜索?
  16. 从0到1搭建大数据平台之数据计算
  17. egg项目服务器部署,egg部署到服务器
  18. Odoo产品分析 (三) -- 人力资源板块(3) -- 休假管理(1)
  19. Python实验舱谢尔宾斯基三角形绘制教程
  20. 关于2021/12/17国内bing不能正常访问的解决方法。

热门文章

  1. 华为员工的感慨 我要在坂田基地裸奔
  2. 万邦京东上传图片到JD API
  3. m5 broadcast
  4. 华为有哪些鸿蒙系统的手机,华为鸿蒙系统支持哪些手机
  5. Watchdog机制原理
  6. 剑网3服务器一直显示维护,《剑网3》11月25日更新内容 正式服务器例行维护
  7. Lilliputian燃料电池块头小电量足 可为智能手机充电十多次
  8. 社会认同感缺失的的情况下,如何守住内心那丝光明
  9. 不小心清空了回收站怎么恢复?恢复误删除的方法
  10. bios 刷 灵耀14_华硕灵耀deluxe14怎么u盘启动 华硕灵耀deluxe14 u盘启动方法