效果

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.absolutePath() + m_url.fileName();
        QDir dir;
        if (dir.exists(fileInfo.absolutePath()))
        {
            if (newFileInfo.exists())
                newFileInfo.dir().remove(newFileInfo.fileName());
            QFile::rename(m_strFileName, newFileInfo.absoluteFilePath());
        }
    }
    else
    {
        QString strError = reply->errorString();
        qDebug() << "Error:" << strError;
    }

    emit replyFinished(statusCode.toInt());
}

// 用户认证
void DownloadNetworkManager::onAuthenticationRequest(QNetworkReply *reply, QAuthenticator *authenticator)
{
    QByteArray password;
    password.append(");
    password = QByteArray::fromBase64(password);

    QString strPassword(password);

    authenticator->setUser("wang");
    authenticator->setPassword(strPassword);
}

// 本地写文件
void DownloadNetworkManager::readyRead()
{
    QFileInfo fileInfo(m_strFileName);
    QFileInfo newFileInfo = fileInfo.absolutePath() + m_url.fileName();
    QString strFileName = newFileInfo.absoluteFilePath();

    emit fileName(strFileName);

    // 写文件-形式为追加
    QFile file(m_strFileName);
    if (file.open(QIODevice::Append))
        file.write(m_pReply->readAll());
    file.close();
}

使用

调用download()接口开始下载,关联downloadProgress信号和槽,可以实时获取下载大小、速度、剩余时间等信息。

// 开始下载
void MainWindow::download()
{
    if (m_pNetworkManager == NULL)
    {
        m_pNetworkManager = new DownloadNetworkManager(this);
        connect(m_pNetworkManager, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)), Qt::QueuedConnection);
        connect(m_pNetworkManager, SIGNAL(replyFinished(int)), this, SLOT(replyFinished(int)), Qt::QueuedConnection);
        connect(m_pNetworkManager, SIGNAL(fileName(QString)), m_pFileInfoLabel, SLOT(setText(QString)), Qt::QueuedConnection);
    }
    m_pNetworkManager->execute();
    downloadTime.start();
}

// 计算下载大小、速度、剩余时间
void MainWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    // 总时间
    int nTime = downloadTime.elapsed();

    // 本次下载所用时间
    nTime -= m_nTime;

    // 下载速度
    double dBytesSpeed = (bytesReceived * 1000.0) / nTime;
    double dSpeed = dBytesSpeed;

    //剩余时间
    qint64 leftBytes = (bytesTotal - bytesReceived);
    double dLeftTime = (leftBytes * 1.0) / dBytesSpeed;

    m_pSpeedInfoLabel->setText(speed(dSpeed));
    m_pLeftTimeInfoLabel->setText(timeFormat(qCeil(dLeftTime)));
    m_pFileSizeInfoLabel->setText(size(bytesTotal));
    m_pDownloadInfoLabel->setText(size(bytesReceived));
    m_pProgressBar->setMaximum(bytesTotal);
    m_pProgressBar->setValue(bytesReceived);

    // 获取上一次的时间
    m_nTime = nTime;
}

// 下载完成
void MainWindow::replyFinished(int statusCode)
{
    m_nStatusCode = statusCode;
    QString strStatus = (statusCode == ) ? QStringLiteral("下载成功") : QStringLiteral("下载失败");
    m_pStatusLabel->setText(strStatus);
}

http://blog.csdn.net/liang19890820/article/details/50814339

Qt之HTTP上传/下载(继承QNetworkAccessManager,包括使用了authenticationRequired认证信号)的更多相关文章

  1. Qt之HTTP上传/下载

    简述 在前面章节中我们讲述了关于Qt显示网络图片的内容,比较简单,因为图片一般都比较小,下载到本地速度比较快,所以基本不需要什么特殊处理,本节我们主要针对HTTP实现上传/下载进行详细的讲解与分享,包 ...

  2. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  3. Webwork 学习之路【07】文件上传下载

    Web上传和下载应该是很普遍的一个需求,无论是小型网站还是大并发访问的交易网站.WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺 ...

  4. FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...

  5. 使用PuTTY时的文件上传下载方法

    如果你是个PuTTY重度用户,在使用ssh连上一个远端机器工作了好一阵子后,发现自己需要对 当前会话 上传/下载文件,要怎样才能简单快捷呢? 最简单的方式 最简单的方法: 安装WinSCP或者File ...

  6. WebService实现文件上传下载

    一:服务端:一个普通java web工程 package com.wzh.file; import com.sun.xml.ws.developer.StreamingAttachment; impo ...

  7. Hadoop之HDFS原理及文件上传下载源码分析(下)

    上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文 ...

  8. 文件上传下载、socketserver(并发)、解读socketserver源码

    1.文件上传/下载 学习了socket套接字,我们现在可以写一个文件上传/下载的程序,如下示例: 分析上边代码,我们发现,client发送上传文件相关信息的字典序列化之后,server又给client ...

  9. Webwork【07】文件上传下载

    Web上传和下载应该是很普遍的一个需求,无论是小型网站还是大并发访问的交易网站.WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺 ...

随机推荐

  1. Keil C51必须注意的一些有趣特性

    Keil c51号称作为51系列单片机最好的开发环境,大家一定都很熟悉.它的一些普通的特性大家也都了解,(书上也都说有)如:因为51内的RAM很小,C51的函数并不通过堆栈传递参数(重入函数除外),局 ...

  2. 在FMX中实现PostMessage的方法

    在FMX中实现PostMessage的方法 http://www.qdac.cc/?p=1090 2014-10-31 • Android.C++ Builder.Delphi.杂谈 • 4条评论 • ...

  3. VS2008资源问题解决方法

    错误提示:C:/Program Files/Microsoft SDKs/Windows/v6.0A// Include/PrSht.h(0) error RC2247 : SYMBOL name t ...

  4. SEO的URL如何优化才是最佳

    原文地址:http://www.chinaz.com/web/2007/0413/6841.shtml 很多人都知道URL对SEO的重要之处,但是很多站点却忽略了站点的路径优化.今天本人在这里写几点关 ...

  5. Java 自定义实现 LRU 缓存算法

    背景 LinkedHashMap继承自HashMap,内部提供了一个removeEldestEntry方法,该方法正是实现LRU策略的关键所在,且HashMap内部专门为LinkedHashMap提供 ...

  6. Oracle判断语句集合(转载)

    SELECT decode(sign(to_date('2008-05-01', 'yyyy-MM-dd') -                   to_date('2008-03-01', 'yy ...

  7. deciaml(十进制浮点运算)

    # -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #========== ...

  8. 机器设备(dfs)

    机器设备 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Alpha 公司设计出一种节能的机器设备.它的内部结构是由 N 个齿轮组成.整个机器设备有 一个驱动齿轮,当 ...

  9. CreateFile使用方法和样例

    函数原型: HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名称的指针 DWORD dwDesiredAccess, //訪问模式(写/读) DWORD dw ...

  10. .net批量删除和添加

    往页面上拖一个GridView,设置好数据源,并为GridView添加一个模板列,往模板列里添加一个chekcbox,比如下面的代码 <asp:GridView ID="GridVie ...