简述
在前面章节中我们讲述了关于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.