利用QNetworkAccessManager和QHttp完成文件下载有关问题
利用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_OBJECT public: 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()); }