Qt 下载文件

#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();

}


 
 

猜你喜欢

转载自blog.csdn.net/xzpblog/article/details/75174803