当前位置:   article > 正文

【QT实现下载功能】通过request请求下载并保存到本地

【QT实现下载功能】通过request请求下载并保存到本地

想要做一个带有向http请求并获得内容功能的软件,通过寻找网上的示例,了解了想要实现这个功能,主要有几个部分要点:
1.联网(要勾选添加QNetwork库)
2.向http请求内容(发request)
3.获得http返回的内容(定义reply信号,若服务器返回消息,就执行我们自己写的槽函数里的动作,比如下载东西)
差不多就以上三个点,保存到本地的话可以直接保存在QDir::currentPath()当前目录下,也可以定义一个路径并在这个路径下mkdir创建文件夹。(记得添加QDir库)

void PostGet31::createDir()
{
    QDir dir(QDir::currentPath());
    QString new = "saveDir";
    dir.mkdir(new);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

一、联网

勾选Qt Network
勾选Qt Network modules,并添加相关库

#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
  • 1
  • 2
  • 3
  • 4

二、向http请求内容

然后请求链接内容,先付出才有收获,所以要先请求。

	//这两个信号我定义在private里了
    QNetworkReply* reply;
    QNetworkAccessManager* manager;
    
    void PostGet31::startRequest() 
{
    QUrl url = remoteUrl.trimmed();
    manager = new QNetworkAccessManager(this);
    QString fullFileName = localsavedir + url.fileName();
    if (QFile::exists(fullFileName))
    {
        QFile::remove(fullFileName);
    }
    downFile = new QFile(fullFileName);
    if (!downFile->open(QIODevice::WriteOnly))
    {
        return;
    }
    ui.downloadbtn->setEnabled(false);
    //用get发送请求
    reply = manager->get(QNetworkRequest(url));
    //调用QNetworkReply类里的方法连接槽,触发条件是reply有收到消息
    //注意,reply没有finished是接收不到消息的
    connect(reply, &QNetworkReply::finished, this, &PostGet31::networkReplyFinished);
    connect(reply, &QNetworkReply::readyRead, this, &PostGet31::networkReplyReadyRead);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

三、获得http返回的内容

如果reply->finished就可以准备reply->read读了,这里用的是readAll读全部内容。

void PostGet31::networkReplyFinished()
{
    if (reply->error()) {
        qDebug() << "debug info:" << reply->errorString();
        reply->deleteLater();
        return;
    }
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() << "statusCode:" << statusCode;
    qDebug() << reply->readAll();
    QFileInfo fileInfo;
    fileInfo.setFile(downFile->fileName());
    downFile->close();
    delete downFile;
    reply->deleteLater();
    reply = nullptr;
}
void PostGet31::networkReplyReadyRead()
{
    downFile->write(reply->readAll());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

四、其他

用到的其他头文件有这些,后面那几个是为了显示当前时间和下载后会弹出信息框提示已经下载完成或下载失败的,不加也行。

#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>
#include <QDateTime>
#include <QMessageBox>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

正文完

一开是用的是www.baidu.com来测试请求,但是一直跑不通,状态码是多少忘了,reply显示什么unknown protocol,结果原来是没加http://
url报错
然后就是另外一个问题,当时还是对get post懵懵懂懂,一直下载不了公网上请求的压缩包/软件,后来一步步调试发现状态码还是0,是因为还没有reply完就开始请求下载软件,这样当然是不可以的。

   manager = new QNetworkAccessManager(this);
   reply = manager->get(QNetworkRequest(url));
    connect(reply, &QNetworkReply::finished, this, &PostGet31::on_finished);
    connect(reply, &QNetworkReply::readyRead, this, &PostGet31::readyread);
  • 1
  • 2
  • 3
  • 4

参考文档

Qt发起http请求,get和post方式,并接收响应数据
Qt 基于http的网络文件下载
一个QT QNetworkAccessManager访问https网址reply错误的问题
URL报错:unknown protocol

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号