最近在做一个关于下载文件的功能,其中需要支持断点续传功能,此前也接触过下载文件,这里使用Qt的QNetworkAccessManager来下载管理,但是其中考虑到一个问题,那就是需要判断该下载链接是否可以断点下载(即判断服务器是否支持断点续传功能),网上搜罗了一番,貌似好像找到了VC的断点续传的判断,但是其中是vc下的断点续传的判断,我在想Qt下面如果可以做到先判断是否支持断点呢,于是找到了一个方法专门获取http 头部信息的方法,具体见以下代码:
<span style="font-size:18px;"> 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();</span>
其中reple->errorString()返回http头的错误信息,目前我截获的错误时202,此文件肯定不支持断点的,上面列子是说返回206表示支持
在这其中还可以看到 我们可以首先获取http头部信息,包括该文件的长度(据说该方法有时候并非真实文件长度)
其后我们稍微写下断点的代码
<span style="font-size:18px;">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());</span>
通过设置http头部信息,给服务器指定文件偏移量进行数据交互
PS:此方法还可以设为多线程下载,即一个文件可以使用多个线程进行下载,从而提高了整个文件的下载速率。