QtDownloadTool——简单的HTTP资源下载工具

原创 2017年11月14日 19:55:58

闲话

之前想着迅雷9那广告满天的界面,简直被恶心到了,就想着自己写个下载工具,结果花几个小时写好(copy好别人的代码),发现还是TM迅雷下载着舒服,毕竟人家那这么多年的P2P技术不是摆设,自己也只是写着玩玩儿,学习学习而已。程序运行图如下:
这里写图片描述

资源获取

要下载文件之前,当然要获取到资源文件,才可以开始下载,Qt实现了一个简单的资源获取方法:

/* 通过url获取文件名 */
QString Network::getFileInfo(QString task)
{
    QUrl url = QUrl::fromEncoded(task.toLocal8Bit());
    QString path = url.path();
    QString fileName = QFileInfo(path).fileName();

    return fileName;
}

在我们的面前就是传个url的path到QFileInfo类中,然后就可以返回资源名,很简单,当然只能获取简单的资源文件,要是像什么度娘上的图片或者度盘的链接,是识别不出来的。之前也看过别人的博客说可以先发http请求获取,不过自己没试过,也不知道是否可行。

开始下载

既然是一个HTTP资源下载工具,当然需要设计到HTTP请求,这里的请求很简单,其实也就是设置一下HTTP请求头而已:

QNetworkRequest request(url);

request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
request.setRawHeader("Range", QString("bytes=%1-").arg(currentFileSize).toLatin1());

第一个请求头,产生请求的浏览器类型;
第二个请求头,接收文件的位置和范围。这个请求是最关键的,用来实现断点续传。

设置好请求头后,只需要连接几个接收的槽函数,就可以开始接收文件了:

reply = manager.get(request);

connect(reply, SIGNAL(readyRead()), this, SLOT(readyToRead()));
connect(reply, SIGNAL(finished()),  this, SLOT(downloadFinished()));
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
        this, SLOT(downloadProgress(qint64,qint64)));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(downloadError(QNetworkReply::NetworkError)));

这几个槽的意思就很清楚了:
第一个,数据准备好,等着我们去读了;
第二个,文件接收完成;
第三个,接收的进度;
第四个,接收过程中发生的错误。

读函数,只需要往文件里写就对了:

void Network::readyToRead()
{
    /* write data to file */
    file.write(reply->readAll());
}

错误处理,这里我就只把错误打印出来,把下载停了就完事儿了,没做过多处理:

void Network::downloadError(QNetworkReply::NetworkError code)
{
    qDebug() << "Failed: " << code;

    stopTask(currentTask);
}

接收完成,向界面发送消息,同时把任务从下载列表中删除掉,如果任务队列不为空就开始下一个任务:

void Network::downloadFinished()
{
    file.close();

    timeElapsed = 0;

    isDownloading = false;

    downloadList.removeOne(currentTask);

    if (reply->error()) {
        qDebug() << "Failed: " << reply->errorString();
        return ;
    }

    reply->deleteLater();

    emit taskFinished(currentTask);

    if (!downloadList.isEmpty()) {
        QString taskNext = downloadList.first();
        startDownload(taskNext, downloadPath);
    }
}

从上面可以看出,这里也打印了错误信息,因为当发生错误,传输中断后,也会接收到finished()信号。

下载进度,在这可以获取下载到的文件大小,然后自己也可以实现速度计算:

void Network::downloadProgress(qint64 bytesReceived, qint64 byteTotal)
{
    double speed = (bytesReceived * 1000.0) / (downloadTime.elapsed() + timeElapsed);
    timeLast  = downloadTime.elapsed();

//    qDebug() << "Time elapse:" << downloadTime.elapsed() + timeElapsed;

    double percent = (bytesReceived + currentFileSize) * 100.0 / (byteTotal + currentFileSize);
    if (percent >= 100.0) {
        downloadFinished();
        return ;
    }

    emit process(currentTask, byteTotal + currentFileSize, percent, speed);
}

需要注意的是,如果是断点续传,这里获取到的byteTotal是还未接收的数据大小,所以需要把之前下载大小保存起来,当然也可以通过读已写文件大小来获取。

至于界面什么的,就不说了,不得不承认自己没有一点艺术细胞,代码下载地址:
https://github.com/DragonPang/QTDownloadTool

版权声明:本文为博主原创文章,未经博主允许不得转载。

实现HTTP断点续传下载工具(附源代码)

在前面的文章曾讨论了HTTP消息头的三个和断点继传有关的字段。一个是请求消息的字段Range,另两个是响应消息字段Accept-Ranges和Content-Range.其中Accept-Ranges...
  • u011625768
  • u011625768
  • 2015年01月28日 11:40
  • 1099

一个简单的HTTP测试工具:Send HTTP Tool

我们在调用或者测试测试HTTP协议,或者第三方系统公布的RESTFul Web服务的API的时候,可以有很多种方法,比如,自己在cmd行中,打开telnet,然后拼写HTTP的数据;或者用Fiddle...
  • chancein007
  • chancein007
  • 2014年06月14日 22:47
  • 7118

使用单例模式实现自己的HttpClient工具类

引子 在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpC...
  • hj7jay
  • hj7jay
  • 2016年04月27日 11:52
  • 2113

开源一款资源分享与下载工具 —— 电驴(eMule)

这里分享一款资源分享与下载工具——电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/。大概...
  • analogous_love
  • analogous_love
  • 2017年07月07日 10:41
  • 1364

Android APP更新下载工具类——简单封装DownloadManager

几乎所有APP都包含了检查更新功能,更新下载功能的实现方式常用的有两种:1、使用App网络框架的文件下载请求;2、使用自带的DownloadManager类;本文介绍第二种,简单封装一下Downloa...
  • u011984292
  • u011984292
  • 2017年05月16日 13:49
  • 226

【java】HttpClient实现HTTP文件通用下载工具类

import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.apache...
  • yjqyyjw
  • yjqyyjw
  • 2015年12月15日 15:23
  • 2498

Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(附源代码)

PS:本文中使用的下载url已经不能用于验证例子,可以下载自己电脑服务器上的文件 转自:http://www.blogjava.net/nokiaguy/archive/2009/06/archiv...
  • DADADIE
  • DADADIE
  • 2015年04月20日 15:14
  • 919

Windows ISO镜像资源专用下载工具(Windows ISO Downloader) v4.0 绿色免费版

Windows ISO Downloader Tool (直接从微软服务器下载Windows 7,8.1,10 各版本 ISO工具 Windows ISO Downloader是HeiDOc网站...
  • jiangmy927
  • jiangmy927
  • 2016年10月18日 17:57
  • 421

仿迅雷实现下载工具,支持断点续传和多线程下载以及简单界面展示

这篇博客介绍一下在公司实习时选做的一个项目,虽然实习期间没有全部完成,但觉得这个项目做好的话挺有意思的,就在之后几天赶着完善了这个项目。这个项目是仿照迅雷,实现一个下载工具。 (开发平台: Ubun...
  • Chengzi_comm
  • Chengzi_comm
  • 2016年11月04日 18:58
  • 1897

Android 实现一个简单的下载工具

Android 实现一个简单的下载工具 2017-03-17 Othershe code小生 点击上方“code小生”关注本公众号 本篇由 Othershe 投稿,这...
  • hzp666
  • hzp666
  • 2017年03月20日 16:59
  • 357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QtDownloadTool——简单的HTTP资源下载工具
举报原因:
原因补充:

(最多只允许输入30个字)