您的位置:首页 > 编程语言 > Qt开发

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

2013-09-13 17:54 966 查看
最近在做一个关于下载文件的功能,其中需要支持断点续传功能,此前也接触过下载文件,这里使用Qt的QNetworkAccessManager来下载管理

但是其中考虑到一个问题,那就是需要判断该下载链接是否可以断点下载(即判断服务器是否支持断点续传功能),网上搜罗了一番,貌似好像找到了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:此方法还可以设为多线程下载,即一个文件可以使用多个线程进行下载,从而提高了整个文件的下载速率。

以上关于断点续传的各种可能需要用到的情况都罗列了,如有错误,欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: