关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)

       最近在做一个关于下载文件的功能,其中需要支持断点续传功能,此前也接触过下载文件,这里使用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:此方法还可以设为多线程下载,即一个文件可以使用多个线程进行下载,从而提高了整个文件的下载速率。

转载自:http://www.xuebuyuan.com/1656322.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值