Qt开发技巧之Http下载器(支持多线程和断点传续)

QQ:1075200597   WX:HCccc-orz   转载时请标注来源

闲着无聊,做了个http下载器。

1.准备工作

首先,我们要看当前Qt版本支持的ssl的版本(因为要用到https)。

在安装Qt时,在最下面会有选项是否选择SSL,不过好像下的是最新的3,我用的开发版本是5.15.2仅支持OpenSSL 1.1.1的版本。并且在pro文件加上network模块。

准备好以上工作,就可以正式进入开发了。

2.实际操作。

void download::StartDownload()
{
    QUrl url(m_downloadUrl);
    fileInfo= url.path();
    if(file == nullptr)
    {
        file= new QFile(m_savePath+'/'+fileInfo.fileName());
    }
    file->open(QIODevice::WriteOnly);//只读方式打开文件
    if(accessManager == nullptr)
    {
        accessManager= new QNetworkAccessManager();
    }
    nowbyte = file->size();
    request.setUrl(url);
    request.setRawHeader(QByteArray("Range"), QString("bytes=%1-").arg(nowbyte).toLocal8Bit());
    qDebug()<<nowbyte;
    reply=accessManager->get(request);//通过发送数据,返回值保存在reply指针里.
    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish为manager自带的信号,replyFinished是自定义的
    connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT( onDownloadProgress(qint64 ,qint64 )));//download文件时进度
    connect((QObject *)reply, SIGNAL(readyRead()),this, SLOT(onReadyRead()));
}
void download::replyFinished(QNetworkReply *reply){
    //获取响应的信息,状态码为200表示正常
    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    qDebug()<<"nowbyte"<<nowbyte;
    if(nowbyte == totalbyte)
    {
        nowbyte = 0;
    }
    if (reply->isOpen())
    {
        QByteArray bytes = reply->readAll();
        QString result(bytes);
        // 处理成功情况,例如保存数据或更新界面
    }

}

void download::onReadyRead()
{
    QByteArray data = reply->readAll();
    file->write(data);

}


void download::StopDownload()
{
    if(!httpRequestAbort)
    {
        reply->abort();//响应终止
        httpRequestAbort=true;
        reply->deleteLater();
    }
    else
    {
        StartDownload();
        httpRequestAbort=false;
    }
}

然后只需要主线程中movetothread就可以开启线程了。

3.断点传续

什么是断点传续

断点续传 (Resume Transfer Protocol)是指在文件传输过程中断掉之后,能够在下一次传输时从断点处继续传输,而不需要重新传输已经传输过的数据。断点续传可以避免网络连接不稳定、传输出错等情况下的数据丢失,提高文件传输的效率。

怎么操作

request.setRawHeader(QByteArray("Range"), QString("bytes=%1-").arg(nowbyte).toLocal8Bit());

加一个http头即可,分块也可以0-5000,5000-10000等等。

后续会加入多任务,自定义model,view等等。尽量做成迅雷一样或者用qml来搭个界面。

代码的下载链接

以上就是今天的分享,请点赞评论分享,期待后续更多技术分享

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值