Qt 案例 使用QNetworkReply或者URLDownloadToFile 下载http、https资源到本地路径

Qt 使用QNetworkReply或者URLDownloadToFile两种不同方式下载http、https链接资源文件,并且获取下载进度。

目录

    • 一、 使用 URLDownloadToFile 下载
    • 二、 使用 QNetworkReply 下载
    • 三、 打包好的可执行程序示例下载
    • 四、 会员或订阅专栏下载源码

一、 使用 URLDownloadToFile 下载

使用【 URLDownloadToFile 】下载数据,只需调用函数,如果需要显示进度信息也只需要继承【IBindStatusCallback】类,通过重写OnProgress方法就能获取到及时进度:
头文件调用:

	#include <iostream>#include <Urlmon.h>// 下面这个也是#pragma comment(lib, "Urlmon.lib")// HRESULT URLDownloadToFile(//         LPUNKNOWN            pCaller,//         LPCTSTR              szURL,//         LPCTSTR              szFileName,//_Reserved_ DWORD                dwReserved,//         LPBINDSTATUSCALLBACK lpfnCB//);

调用:

    HRESULT ret =URLDownloadToFile(nullptr,_httpurl,_filepath,0,(LPBINDSTATUSCALLBACK)this);if (ret != S_OK)return false; // 下载失败

继承IBindStatusCallback主要需要实现以下方法,其中通过重写OnProgress方法获取到下载进度,通过返回S_OKE_ABORT判断是否继续下载文件:

class DOWNFILES:public QObject,public IBindStatusCallback
{HRESULT __stdcall QueryInterface(const IID &, void **) { return E_NOINTERFACE; }ULONG STDMETHODCALLTYPE AddRef(void) { return 1; }ULONG STDMETHODCALLTYPE Release(void) { return 1; }HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib) { return E_NOTIMPL; }virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority) { return E_NOTIMPL; }virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved){ return S_OK; }virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError) { return E_NOTIMPL; }virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo) { return E_NOTIMPL; }HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed){ return E_NOTIMPL; }virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk) { return E_NOTIMPL; }//    virtual HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)//    { if (ulProgressMax != 0) { double *percentage = new double(ulProgress * 1.0 / ulProgressMax * 100); //将percentage 发送给显示 delete percentage; } return S_OK;///进度HRESULT OnProgress( unsigned long ulProgress, unsigned long ulProgressMax,  unsigned long ulStatusCode, LPCWSTR  szStatusText) ;//{if(!THREAD_IS_SHOULD_QUIT){ return S_OK;} else {return E_ABORT;}}
};

注意: 使用URLDownloadToFile 下载数据时会在
【(参考路径)C:\Users\admin\AppData\Local\Microsoft\Windows\INetCache\IE】目录下生成缓存文件,如果是小文件影响不大,如果超过1G,系统盘很容易就没有使用空间。
也可以使用 DeleteUrlCacheEntry(URL链接) 或删除参考路径下的文件,但可能有其他问题
不建议使用这种方式下载。

二、 使用 QNetworkReply 下载

使用【QNetworkReply】下载数据,主要通过readyReaddownloadProgress信号保存数据和获取进度。如果是https链接还需要下载QSslSocket相关库。
pro头添加:

QT += network

URL下载资源数据校验参考:
可通过修改RawHeader的Range参数实现下载的断点继续下载功能。
通过返回的Last-Modified参考是否是最新文件,
通过返回的Content-Range获取文件大小。
添加QNetworkRequest 的重定向防止部分链接是跳转Https资源

#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>//! url 
//! filesize 获取文件大小
//! outime 链接超时时间
bool QTDOWNFILES::urlData_Validation(QString url,quint64& filesize,int outime)
{bool IsSuccess=false;qDebug()<<"[url] 数据效验:";QNetworkRequest request;request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);   //启动重定向qDebug()<<"[urlData_Validation] "<<url;///获取前500个字节效验文件是否过期request.setRawHeader("Range","bytes=0-499");request.setUrl(QUrl(url));//超时时间QTimer * out_timer = new QTimer();QEventLoop eventLoop;QNetworkAccessManager* manager=new QNetworkAccessManager();QNetworkReply *reply =manager->get(request);///线程超时QObject::connect(out_timer,&QTimer::timeout,reply,&QNetworkReply::abort,Qt::UniqueConnection);///只需要加载一次QObject::connect(reply, SIGNAL(readyRead()),&eventLoop, SLOT(quit()));out_timer->start(outime);eventLoop.exec(QEventLoop::ExcludeUserInputEvents);out_timer->stop();if(reply->error() != QNetworkReply::NoError){IsSuccess=false;}if(reply->hasRawHeader("Content-Range")){QVariant contentrange = reply->rawHeader("Content-Range");qDebug()<<"[Content-Range] "<<contentrange;QString size=contentrange.toString().mid((0,contentrange.toString().indexOf("/")+1));qDebug()<<"Size : "<<size;filesize=size.toLongLong();IsSuccess=true;}//    if(reply->hasRawHeader("Last-Modified"))//    {//        QVariant contentrange = reply->rawHeader("Last-Modified");//        QString LastModified=contentrange.toString();//        qDebug()<<"LastModified : "<<LastModified;//    }manager->clearConnectionCache();manager->clearAccessCache();reply->abort();reply->close();return IsSuccess;
}

绑定readyRead信号获取数据,和获取进度:

void QTDOWNFILES::WriteFileData()
{if(reply!=nullptr && file!=nullptr){//file 打开的QFILE类型文件QByteArray temparray= reply->readAll();if(temparray.length()>0)file->write(temparray);temparray.clear();}
}void QTDOWNFILES::HaveFulfilled(qint64 bytesRead,qint64 totalBytes)
{emit ToFulfilled(bytesRead,totalBytes);
}

1.注意: 使用QNetworkReply 下载时为了防止界面卡顿而使用多线程时,可以将QNetworkReply 的方法实现放入QOBJECT类中,在使用一个线程类来调用QOBJECT类中的方法,这样就避免了写入文件线程不同步的问题。也避免使用写锁。
2.SSL问题: HTTPS资源文件需要使用SSL库。
否则出现异常提示:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
参考链接:
1.Qt 解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed问题
2.解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

三、 打包好的可执行程序示例下载

详见文章绑定资源;
在这里插入图片描述

在这里插入图片描述

四、 会员或订阅专栏下载源码

Qt开发项目案例-以及部分示例的源码下载链接

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

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

相关文章

pv操作题目笔记

对于 pv 操作分以下几步走 什么是pv操作 PV操作在进程同步中通常指的是信号量&#xff08;Semaphore&#xff09;操作。信号量是一种用于控制多个并发进程或线程之间的同步和互斥访问的同步工具。PV操作通常涉及两个基本操作&#xff1a;P操作&#xff08;wait操作&#xff0…

hdlbits系列verilog解答(向量门操作)-14

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 构建一个具有两个 3 位输入的电路&#xff0c;用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的逆 &#xff08;NOT&#xff09;。将b反相输出到out_not上半部分&#xff0c;将a 的反相输出到out…

git pull 和 git fetch 有什么区别?

一、是什么 先回顾两个命令的定义 git fetch 命令用于从另一个存储库下载对象和引用git pull 命令用于从另一个存储库或本地分支获取并集成(整合) 再来看一次git的工作流程图&#xff0c;如下所示&#xff1a; 可以看到&#xff0c;git fetch是将远程主机的最新内容拉到本地…

K8S集群实践之九: Ceph

Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments.1. 说明 因香橙派和树莓派资源所限&#xff0c;转移到基于VirtualBox建立的VMs继续实践…

Java实现添加文字水印、图片水印

目录 前言 一、获取原图片对象信息 1、读取本地图片 2、读取网络图片 二、处理水印 三、添加水印 四、获取目标图片 五、完整工具类 六、结果展示 前言 现在很多人都喜欢在各种平台上分享自己的照片吧&#xff0c;不管是一些制作出来的媒体图片还是精致的人像图片&…

【vue+nestjs】qq第三方授权登录【超详细】

项目场景&#xff1a; 前端使用vue3ts 后端使用nestjs 1.申请appId,appKey 1.进入qq互联官网。创建应用 特别注意 1.在填写网站回调域时,需要你线上真实能访问的。不然审核不通过。我的回调地址是前端路由地址 2.如果你想本地调试&#xff0c;回调到你的线上地址。你可以在本…

Vue3 + TypeScript

Vue3 TS开发环境创建 1. 创建环境 vite除了支持基础阶段的纯TS环境之外&#xff0c;还支持 Vue TS开发环境的快速创建, 命令如下&#xff1a; $ npm create vitelatest vue-ts-pro -- --template vue-ts 说明&#xff1a; npm create vitelatest 基于最新版本的vite进行…

数聚携手永达汽车集团强势入选爱分析《商业智能实践案例》

近日&#xff0c;国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》&#xff0c;此评选活动面向落地商业智能的各行企业和商业智能厂商&#xff0c;以第三方专业视角深入调研&#xff0c;评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

解救Kubernetes混乱:Descheduler快速实现资源平衡

By default, Kubernetes doesn’t recompute and rebalance workloads. You could have a cluster with fewer overutilized nodes and others with a handful of pods How can you fix this? 关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 默认情况下&#xff0c;Ku…

Pyside6 QFileDialog

Pyside6 QFileDialog Pyside6 QFileDialog常用函数getOpenFileNamegetOpenFileNamesgetExistingDirectorygetSaveFileName 程序界面程序主程序 Pyside6 QFileDialog提供了一个允许用户选择文件或目录的对话框。关于QFileDialog的使用可以参考下面的文档 https://doc.qt.io/qtfo…

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

从VTI7064与W25Qxx了解SPI通信协议

在学习过程中记录。 学习背景 最近在做的项目需要设计电路包含外扩FLASH&#xff08;W25Q128&#xff09;与SRAM(VTI7064)&#xff0c;二者都用到了SPI通信协议&#xff0c;之前没学过&#xff0c;学习记录一下。 顺便说一下这次学习中发现的好用工具WPS AI。可以对文档进行…

【STM32】时钟设置函数(寄存器版)

一、STM32时钟设置函数移植 1.时钟模块回顾 一个疑问 前面代码并没有设置时钟为什么可以直接使用。 2.时钟树 3.时钟树分析 1.内部晶振&#xff08;HSI&#xff09; 内部晶振不稳定&#xff0c;当我们上电后&#xff0c;会自动产生振动&#xff0c;自动产生时钟&#xff0c;…

【java爬虫】使用selenium获取某交易所公司半年报数据

引言 上市公司的财报数据一般都会进行公开&#xff0c;我们可以在某交易所的官方网站上查看这些数据&#xff0c;由于数据很多&#xff0c;如果只是手动收集的话可能会比较耗时耗力&#xff0c;我们可以采用爬虫的方法进行数据的获取。 本文就介绍采用selenium框架进行公司财…

2023年10月24日程序员节

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

基于Tucker分解的时序知识图谱补全10.23

基于Tucker分解的时序知识图谱补全 摘要引言相关工作静态知识图谱补全时序知识图谱补全 背景提出的模型学习时间复杂度和参数增长表达能力分析 实验 摘要 知识图谱已被证明是众多智能应用的有效工具。然而&#xff0c;大量有价值的知识仍然隐含在知识图谱中。为了丰富现有的知…

[python 刷题] 19 Remove Nth Node From End of List

[python 刷题] 19 Remove Nth Node From End of List 题目&#xff1a; Given the head of a linked list, remove the nth node from the end of the list and return its head. 题目说的是就是移除倒数第 n 个结点&#xff0c;如官方给的案例&#xff1a; 这里提供的 n 就是…

实时配送跟踪功能的实现:外卖跑腿小程序的技术挑战

在当今数字化时代&#xff0c;外卖和跑腿服务已经成为了生活中不可或缺的一部分。为了提供更好的用户体验&#xff0c;外卖跑腿小程序越来越注重实时配送跟踪功能的实现。这项技术挑战旨在确保顾客可以方便地跟踪他们的订单&#xff0c;以及配送员可以高效地完成送货任务。本文…

经典卷积神经网络 - VGG

使用块的网络 - VGG。 使用多个 3 3 3\times 3 33的要比使用少个 5 5 5\times 5 55的效果要好。 VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确…

TDengine小知识-数据文件命名规则

TDengine 时序数据库对数据文件有自己的命名规则&#xff0c;文件名中包含了vnodeID、时间范围、版本、文件类型等多种信息。了解数据文件命名规则&#xff0c;可以让运维工作更简单。 废话不多说&#xff0c;直接上图&#xff1a; v4&#xff1a;文件所属 Vgroup 组&#xf…