#ifndef HTTPREQUEST
#define HTTPREQUEST
#include<QObject>
#include<QNetworkAccessManager>
#include<QFile>
#include<QNetworkReply>
#include<QTimer>
class HttpRequest:public QObject
{
Q_OBJECT
public:
HttpRequest(QObject *parent=0);
void DownLoad(const QString& savePath,const QString& url);
~HttpRequest();
public:signals:
void dwCalBack(qint64 speed,qint64 size);
void downFished(const QString& fileName);
void downLoadErr();
private slots:
void ReplyNewDataArrived();
void ReplyFinished();
void ReplyDownloadProgress(qint64 a,qint64 b);
void ReplyError(QNetworkReply::NetworkError err);
private:
QNetworkAccessManager *m_netAccessManager;//网络参数
QNetworkReply *m_netReply;
QFile *m_file;
bool hasFished;
bool InitFilePath(const QString& path,const QString& url);
};
#endif // HTTPREQUEST
#include"httprequest.h"
#include<QUrl>
#include<QNetworkRequest>
#include<QFileInfo>
#include<QDir>
#include<QDebug>
HttpRequest::HttpRequest(QObject *parent):QObject(parent)
{
m_netAccessManager = new QNetworkAccessManager(this);
m_file = NULL;
hasFished = false;
}
void HttpRequest::DownLoad(const QString &savePath, const QString &url)
{
qDebug()<<"准备下载"<<url;
if(!InitFilePath(savePath,url))
return;
m_netReply = m_netAccessManager->get(QNetworkRequest(QUrl(url)));
connect(m_netReply,SIGNAL(readyRead()),this,SLOT(ReplyNewDataArrived()));
connect(m_netReply,SIGNAL(finished()),this,SLOT(ReplyFinished()));
connect(m_netReply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(ReplyDownloadProgress(qint64,qint64)));
connect(m_netReply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(ReplyError(QNetworkReply::NetworkError)));
}
HttpRequest::~HttpRequest()
{
if(m_file!=NULL){
m_file->close();
}
}
bool HttpRequest::InitFilePath(const QString &path,const QString& url)
{
QFileInfo fileinfo(QUrl(url).path());
QString m_strFileName = "";
if(!path.isEmpty())
{
QDir directory(path);
if(!directory.exists())
directory.mkdir(path);
m_strFileName = path + "/" + fileinfo.fileName();
}
if(QFile::exists(m_strFileName))
QFile::remove(m_strFileName);
m_file = new QFile(m_strFileName);
if(!m_file->open(QIODevice::WriteOnly))
{
qDebug()<<"初始化路径失败"<<m_file->fileName()<<m_strFileName<<url;
delete m_file;
m_file = NULL;
return false;
}
return true;
}
void HttpRequest::ReplyNewDataArrived()
{
if(m_file)
{
m_file->write(m_netReply->readAll());
m_file->flush();
}
}
void HttpRequest::ReplyFinished()
{
QString name = m_file->fileName();
m_file->close();
m_file = NULL;
if(hasFished)
emit downFished(name);
// qDebug()<<"下载完成"<<name;
}
void HttpRequest::ReplyDownloadProgress(qint64 a, qint64 b)
{
qDebug()<<a<<b;
if(b == 0){
hasFished = false;
return;
}
hasFished = true;
emit dwCalBack(a,b);
}
void HttpRequest::ReplyError(QNetworkReply::NetworkError err)
{
emit downLoadErr();
}