資源簡介
如何用Qt 的方法進行HTTP 請求下載文件,能夠支持斷點續傳(斷點續傳即能夠手動停止下載,下次可以從已經下載的部分開始繼續下載未完成的部分,而沒有必要從頭開始上傳下載),并且實時更新下載信息。整體代碼考慮十分周到,對各種情況也做了相應的處理,并且有通俗易懂的注釋。

代碼片段和文件信息
#include?“downloadmanager.h“
#include?
#include?
#include?
#include?
#define?DOWNLOAD_FILE_SUFFIX “_tmp“
DownLoadManager::DownLoadManager(Qobject?*parent)
:?Qobject(parent)
?m_networkManager(NULL)
?m_url(QUrl(““))
?m_fileName(““)
?m_isSupportBreakPoint(false)
?m_bytesReceived(0)
?m_bytesTotal(0)
?m_bytesCurrentReceived(0)
?m_isStop(true)
{
m_networkManager?=?new?QNetworkAccessManager(this);
}
DownLoadManager::~DownLoadManager()
{}
//?設置是否支持斷點續傳;
void?DownLoadManager::setDownInto(bool?isSupportBreakPoint)
{
m_isSupportBreakPoint?=?isSupportBreakPoint;
}
QString?DownLoadManager::getDownloadUrl()
{
return?m_url.toString();
}
//?開始下載文件;
void?DownLoadManager::downloadFile(QString?url??QString?fileName)
{
//?防止多次點擊開始下載按鈕,進行多次下載,只有在停止標志變量為true時才進行下載;
if?(m_isStop)
{
m_isStop?=?false;
m_url?=?QUrl(url);
//?從url?中獲取文件名,但不是都有效;
//? QFileInfo?fileInfo(m_url.path());
//? QString?fileName?=?fileInfo.fileName();
//?將當前文件名設置為臨時文件名,下載完成時修改回來;
m_fileName?=?fileName?+?DOWNLOAD_FILE_SUFFIX;
//?如果當前下載的字節數為0那么說明未下載過或者重新下載
//?則需要檢測本地是否存在之前下載的臨時文件,如果有則刪除
if?(m_bytesCurrentReceived?<=?0)
{
removeFile(m_fileName);
}
QNetworkRequest?request;
request.setUrl(m_url);
//?如果支持斷點續傳,則設置請求頭信息;
if?(m_isSupportBreakPoint)
{
QString?strRange?=?QString(“bytes=%1-“).arg(m_bytesCurrentReceived);
request.setRawHeader(“Range“?strRange.toLatin1());
}
m_reply?=?m_networkManager->get(request);
connect(m_reply?SIGNAL(downloadProgress(qint64?qint64))?this?SLOT(onDownloadProgress(qint64?qint64)));
connect(m_reply?SIGNAL(readyRead())?this?SLOT(onReadyRead()));
connect(m_reply?SIGNAL(finished())?this?SLOT(onfinished()));
connect(m_reply?SIGNAL(error(QNetworkReply::NetworkError))?this?SLOT(onerror(QNetworkReply::NetworkError)));
}
}
//?下載進度信息;
void?DownLoadManager::onDownloadProgress(qint64?bytesReceived?qint64?bytesTotal)
{
if?(!m_isStop)
{
m_bytesReceived?=?bytesReceived;
m_bytesTotal?=?bytesTotal;
//?更新下載進度;(加上?m_bytesCurrentReceived?是為了斷點續傳時之前下載的字節)
emit?signalDownloadProcess(m_bytesReceived?+?m_bytesCurrentReceived?m_bytesTotal?+?m_bytesCurrentReceived);
}
}
//?獲取下載內容,保存到文件中;
void?DownLoadManager::onReadyRead()
{
if?(!m_isStop)
{
QFile?file(m_fileName);
if?(file.open(QIODevice::WriteOnly?|?QIODevice::Append))
{
file.write(m_reply->readAll());
}
file.close();
}
}
//?下載完成;
void?DownLoadManager::onfinished()
{
m_isStop?=?true;
QVariant?statusCode?=?m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if?(m_reply->error()?==?QNetworkReply::NoError)
{
//?重命名臨時文件;
QFileInfo?fileInfo(m_fileName);
if?(fileInfo.exists())
{
int?index?=?m_fileName.lastIndexOf(DOWNLOAD_FILE_SUFFIX);
QString?realName?=?m_fileName.left(index);
QFile::rename(m_fileName?realName);
}
}
else
{
//?有錯誤輸
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2016-09-29?22:09??MyHttpDownload_9_29\
?????目錄???????????0??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\
?????文件?????????988??2016-09-09?10:38??MyHttpDownload_9_29\MyHttpDownload.sln
?????文件???????33280??2016-09-29?22:09??MyHttpDownload_9_29\MyHttpDownload.v12.suo
?????目錄???????????0??2016-09-29?22:09??MyHttpDownload_9_29\MyHttpDownload\Debug\
?????文件????????4965??2016-09-29?20:15??MyHttpDownload_9_29\MyHttpDownload\downloadmanager.cpp
?????文件????????1106??2016-09-29?20:17??MyHttpDownload_9_29\MyHttpDownload\downloadmanager.h
?????目錄???????????0??2016-09-09?11:19??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\
?????目錄???????????0??2016-09-09?11:19??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\Debug\
?????文件????????7393??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\Debug\moc_downloadmanager.cpp
?????文件????????4574??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\Debug\moc_myhttpdownload.cpp
?????文件???????35549??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\qrc_myhttpdownload.cpp
?????目錄???????????0??2016-09-09?10:38??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\Release\
?????文件????????9612??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\GeneratedFiles\ui_myhttpdownload.h
?????文件?????????744??2016-09-28?08:53??MyHttpDownload_9_29\MyHttpDownload\main.cpp
?????文件????????5630??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\myhttpdownload.cpp
?????文件?????????878??2016-09-29?14:04??MyHttpDownload_9_29\MyHttpDownload\myhttpdownload.h
?????文件?????????156??2016-09-29?14:48??MyHttpDownload_9_29\MyHttpDownload\myhttpdownload.qrc
?????文件????????6026??2016-09-29?14:52??MyHttpDownload_9_29\MyHttpDownload\myhttpdownload.ui
?????文件???????12900??2016-09-09?11:19??MyHttpDownload_9_29\MyHttpDownload\MyHttpDownload.vcxproj
?????文件????????3213??2016-09-09?11:19??MyHttpDownload_9_29\MyHttpDownload\MyHttpDownload.vcxproj.filters
?????文件?????????677??2016-09-29?22:07??MyHttpDownload_9_29\MyHttpDownload\MyHttpDownload.vcxproj.user
?????目錄???????????0??2016-09-29?14:48??MyHttpDownload_9_29\MyHttpDownload\Resources\
?????文件????????3197??2016-09-29?14:47??MyHttpDownload_9_29\MyHttpDownload\Resources\progressbar.png
?????文件????????3070??2016-09-29?14:46??MyHttpDownload_9_29\MyHttpDownload\Resources\progressbar_back.png
?????目錄???????????0??2016-09-09?11:19??MyHttpDownload_9_29\Win32\
?????目錄???????????0??2016-09-29?22:09??MyHttpDownload_9_29\Win32\Debug\
- 上一篇:計算機組成原理期末考試試題及答案篩選.doc
- 下一篇:Qt 之 實現簡單截圖功能一
評論
共有 條評論