当前位置: 代码迷 >> QT开发 >> 利用QNetworkAccessManager和QHttp完成文件下载有关问题
  详细解决方案

利用QNetworkAccessManager和QHttp完成文件下载有关问题

热度:51   发布时间:2016-04-25 04:50:59.0
利用QNetworkAccessManager和QHttp完成文件下载问题
我的源码如下:
C/C++ code
// 头文件#ifndef SYCHRONIZATION_TASK_H#define SYCHRONIZATION_TASK_H#include <QHttp>#include <QFile>#include <QNetworkAccessManager>#include <QUrl>#include <QNetworkReply>class SynchronizationTask : public QObject{    Q_OBJECTpublic:    SynchronizationTask();    void run();    void startRequest(QUrl url);signals:    void synchronizationFinish();    void synchronizationFail(const QString& msg);private slots:    void httpFinished();    void httpReadyRead();private:    QHttp *m_http;    QString m_state;    QUrl m_url;    QNetworkAccessManager m_qnam;    QNetworkReply *m_reply;    QFile *m_file;    int m_httpGetId;};#endif

C/C++ code
// 源文件#include "sychronizationtask.h"#include <QMessageBox>#include <QFileInfo>#include <QNetworkRequest>SynchronizationTask::SynchronizationTask(HostWindow* host, const QString& state) :     m_host(host),     m_state(state){}void SynchronizationTask::run(){    try    {        m_url = tr("http://www.baidu.com");        QString fileName = QFileInfo(m_url.path()).fileName();        if (fileName.isEmpty())            fileName = "index.html";        if (QFile::exists(fileName)) {            QFile::remove(fileName);        }        m_file = new QFile(fileName);        if (!m_file->open(QIODevice::WriteOnly)) {            delete m_file;            m_file = 0;            emit synchronizationFail(tr("Unable to save the file %1: %2.")                .arg(fileName).arg(m_file->errorString()));        }        // schedule the request        startRequest(m_url);    }    catch(const std::exception &e)    {        emit synchronizationFail(e.what());    }    catch(...)    {        emit synchronizationFail(tr("Unknown exception"));    }}void SynchronizationTask::startRequest(QUrl url){    try    {        QNetworkRequest request;        request.setUrl(url);        m_reply = m_qnam.get(request);        connect(m_reply, SIGNAL(finished()),    this, SLOT(httpFinished()));        connect(m_reply, SIGNAL(readyRead()),this, SLOT(httpReadyRead()));    }    catch(const std::exception &e)    {        emit synchronizationFail(e.what());    }    catch(...)    {        emit synchronizationFail(tr("Unknown exception"));    }}void SynchronizationTask::httpFinished(){    try    {        m_file->flush();        m_file->close();        QVariant redirectionTarget = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute);        if (m_reply->error()) {            m_file->remove();        } else if (!redirectionTarget.isNull()) {            QUrl newUrl = m_url.resolved(redirectionTarget.toUrl());            if (QMessageBox::question(m_host, tr("HTTP"),                tr("Redirect to %1 ?").arg(newUrl.toString()),                QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {                    m_url = newUrl;                    m_reply->deleteLater();                    m_file->open(QIODevice::WriteOnly);                    m_file->resize(0);                    startRequest(m_url);                    return;            }        }         m_reply->deleteLater();        m_reply = 0;        delete m_file;        m_file = 0;        emit synchronizationFinish();    }    catch(const std::exception &e)    {        emit synchronizationFail(e.what());    }    catch(...)    {        emit synchronizationFail(tr("Unknown exception"));    }}void SynchronizationTask::httpReadyRead(){    if (m_file)        m_file->write(m_reply->readAll());}