【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);
}

一、联网

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

#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>

二、向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);
}

三、获得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());
}

四、其他

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

#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>
#include <QDateTime>
#include <QMessageBox>

正文完

一开是用的是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);

参考文档

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值