基于Qt的简易Http下载软件

文章目录

一个简单的Http下载软件,支持 断点续传 ,文件下载完成后可直接预览,不过下载速度一般(每次请求大约10K的数据量,也没有使用多线程切片下载)

完整代码下载:
HttpDownloader 代码下载

可执行文件下载
点击下载

下面的效果截图:
Http软件下载截图
完整效果演示:
简易Http下载完整截图
这里主要使用了使用了类 QNetworkAccessManagerQNetworkRequestQNetworkReply 。具体实现关键部分如下:

 

1. 发送head请求获取文件大小信息

核心代码如下:

  • 发送的请求头设置首部字段 Acceptapplication/octet-stream 表示请求的数据为二进制数据。
  • m_pNetworkManagerQNetworkAccessManager 对象,这里发送的是 head 请求,只返回响应的首部信息。

使用槽函数连接 QNetworkAccessManagerfinished 信号,当 QNetworkAccessManager 处理完成服务器的响应后,发送此信号。

槽函数的处理关键代码如下:

响应的首部中,Content-Length 表示请求的文件大小。
注意 :这里没有做30X的重定型请求,比如请求有些URL并不是真正的下载地址,会返回30X,这时候需要自己处理。比如如果返回301,则需要在返回的首部中 Location 首部字段中获取真正的下载地址。

 

2. 发送获取部分文件请求

为了实现断点续传,这里使用Http协议中的 Range 首部字段,表明只需要部分资源的请求。
比如下图是我使用 Fiddler 抓包的首部信息:
Fiddler截图
发送的首部字段

Range: bytes=860244-870484

表明请求资源的从 860244字节 到 870484字节的信息。

响应首部字段

Content-Length: 10241
Content-Range: bytes 860244-870484/994356

Content-Length 表示真正响应的内容大小
Content-Range 响应的资源范围以及总数

发送请求代码如下:

使用 get() 函数发送 get 请求。这里将响应的信号 readyRead() 和 槽函数连接 slotReadyRead() 。在槽函数中,主要实现文件数据的写入。当本次请求的数据全部相应完成时,QNetworkAccessManager 对象会发送 finished 信号。
下面是槽函数 slotReadyRead 的关键代码:

需要值得注意的是,QNetworkAccessManager 对象发送的请求后返回的 QNetworkReply 对象,需要手动释放,一般使用在 finished 信号中使用 deleteLater() 函数。下面是 onReplyFinished 槽的完整代码,如果一次请求处理完毕后,根据条件判断是否需要继续发送资源请求。

 

3. 设置代理

如果使用的是 Fiddler 抓包软件,则需要设置代理,添加如下代码

当下载完成时,打开文件点击按钮打开文件夹,使用函数

测试用下载链接:
音频文件
https://www.douzhq.cn/wp-content/uploads/2020/02/丫蛋蛋-大田後生仔.mp3
https://www.douzhq.cn/wp-content/uploads/2020/02/宝石Gem-野狼disco.mp3
图片
https://www.douzhq.cn/wp-content/uploads/2020/01/memory_pool_headImage.jpg
https://www.douzhq.cn/wp-content/uploads/2020/02/thread_create.jpg
https://www.douzhq.cn/wp-content/uploads/2020/02/downLoadTestPix-scaled.jpg

You May Also Like

About the Author: admin

喜欢编程、爱游戏,更爱生活。

发表评论

电子邮件地址不会被公开。