关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
2013-09-13 17:54
966 查看
最近在做一个关于下载文件的功能,其中需要支持断点续传功能,此前也接触过下载文件,这里使用Qt的QNetworkAccessManager来下载管理
但是其中考虑到一个问题,那就是需要判断该下载链接是否可以断点下载(即判断服务器是否支持断点续传功能),网上搜罗了一番,貌似好像找到了VC的断点续传的判断
但是其中是vc下的断点续传的判断,我在想Qt下面如果可以做到先判断是否支持断点呢,于是找到了一个方法专门获取http 头部信息的方法,具体见以下代码:
其中reple->errorString()返回http头的错误信息,目前我截获的错误时202,此文件肯定不支持断点的,上面列子是说返回206表示支持
在这其中还可以看到 我们可以首先获取http头部信息,包括该文件的长度(据说该方法有时候并非真实文件长度)
其后我们稍微写下断点的代码
通过设置http头部信息,给服务器指定文件偏移量进行数据交互
PS:此方法还可以设为多线程下载,即一个文件可以使用多个线程进行下载,从而提高了整个文件的下载速率。
以上关于断点续传的各种可能需要用到的情况都罗列了,如有错误,欢迎指正
但是其中考虑到一个问题,那就是需要判断该下载链接是否可以断点下载(即判断服务器是否支持断点续传功能),网上搜罗了一番,貌似好像找到了VC的断点续传的判断
但是其中是vc下的断点续传的判断,我在想Qt下面如果可以做到先判断是否支持断点呢,于是找到了一个方法专门获取http 头部信息的方法,具体见以下代码:
QNetworkAccessManager manager; QEventLoop loop; QNetworkReply *reply = manager.head(QNetworkRequest(m_argLst.at(0))); QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()), Qt::DirectConnection); loop.exec(); QVariant var = reply->header(QNetworkRequest::ContentLengthHeader); qint64 curFileSize = var.toLongLong(); QVariant var1 = reply->header(QNetworkRequest::LocationHeader); QString strUrl = var1.toString(); qDebug()<<"strUrl "<<strUrl<<"\n"<<reply->errorString();
其中reple->errorString()返回http头的错误信息,目前我截获的错误时202,此文件肯定不支持断点的,上面列子是说返回206表示支持
在这其中还可以看到 我们可以首先获取http头部信息,包括该文件的长度(据说该方法有时候并非真实文件长度)
其后我们稍微写下断点的代码
QString Range; if(fileSize=="0") { Range = "bytes " + QString::number(0) + "-"; } else { if(fileSize.toInt()>curFileSize) { Range = "bytes " + QString::number(0) + "-"; }else{ Range = "bytes=" + (fileSize) + "-" + QString::number(curFileSize); } } qDebug()<<"Range: "<<Range<<"\nfileSize "<<fileSize<<"\n"<<basename; request.setRawHeader("User-Agent", "MyOwnBrowser 1.0"); request.setRawHeader("Range",Range.toAscii());
通过设置http头部信息,给服务器指定文件偏移量进行数据交互
PS:此方法还可以设为多线程下载,即一个文件可以使用多个线程进行下载,从而提高了整个文件的下载速率。
以上关于断点续传的各种可能需要用到的情况都罗列了,如有错误,欢迎指正
相关文章推荐
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- 使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
- iphone开发--使用ASIHTTPRequest实现下载,断点续传功能
- Qt通过QNetworkAccessManager实现Http get方法文件下载
- Http下载的另一种实现方式,使用QNetworkAccessManager
- QT学习笔记(四):Http下载的另一种实现方式,使用QNetworkAccessManager
- 关于使用LinkButton实现点击超链完成文件下载的功能
- 文件批量上传的工具,要实现暂停继续、断点续传等功能(使用QtNetwork和QHttpMultiPart,和定时器检查超时)
- 基于RandomAccessFile实现断点文件下载功能
- ios断点续传:通过NSURLSession实现文件下载功能
- 关于使用DataGrid的ButtonColumn,动态添加DataGrid列,实现不定列n个文件的下载功能
- iOS开发-使用NSURLSession实现文件断点下载,文件离线续传以及图片上传
- 关于php支持分块与断点续传文件下载功能代码
- 使用Java实现多线程下载断点续传功能案例
- Java servlet 简单实现http文件下载断点续传功能
- 使用Winnet的下载时,支持断点续传功能
- 使用Thinkphp自带HTTP类的功能实现文件下载