Qt之HTTP上传/下载

简述

在前面章节中我们讲述了关于Qt显示网络图片的内容,比较简单,因为图片一般都比较小,下载到本地速度比较快,所以基本不需要什么特殊处理,本节我们主要针对HTTP实现上传/下载进行详细的讲解与分享,包括:用户认证,实时获取下载大小、速度、剩余时间信息等。

首先看一下即将用到的公式:

文件剩余大小 = 文件总大小 - 文件已下载大小
平均速度 = 文件已下载大小 / 文件已下载大小所用的时间
瞬时速度 = 每秒下载的文件大小
剩余时间 = 文件剩余大小 / 瞬时速度

下面以下载为例,来实现一个文件下载管理器。

效果

这里写图片描述

QNetworkAccessManager

DownloadNetworkManager::DownloadNetworkManager(QObject *parent)
    : QNetworkAccessManager(parent)
{
    // 获取当前的时间戳,设置下载的临时文件名称
    QDateTime dateTime = QDateTime::currentDateTime();
    QString date = dateTime.toString("yyyy-MM-dd-hh-mm-ss-zzz");
    m_strFileName = QString("E:/%1.tmp").arg(date);

    connect(this, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
}

DownloadNetworkManager::~DownloadNetworkManager()
{
    // 终止下载
    if (m_pReply != NULL)
    {
        m_pReply->abort();
        m_pReply->deleteLater();
    }
}

// 设置URL及消息头,开始请求
void DownloadNetworkManager::execute()
{
    m_url = QUrl("http://192.168.*.*/download/2.0.0.zip");

    QNetworkRequest request;
    request.setUrl(m_url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/zip");

    connect(this, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)), this, SLOT(onAuthenticationRequest(QNetworkReply *, QAuthenticator *)));

    m_pReply = get(request);
    connect(m_pReply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64)));
    connect(m_pReply, SIGNAL(readyRead()), this, SLOT(readyRead()));
}

void DownloadNetworkManager::replyFinished(QNetworkReply *reply)
{
    // 获取响应的信息,状态码为200表示正常
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

    // 无错误返回
    if (reply->error() == QNetworkReply::NoError)
    {
        // 重命名临时文件
        QFileInfo fileInfo(m_strFileName);
        QFileInfo newFileInfo = fileInfo.
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值