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来搭个界面。