⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpget.cpp

📁 Qt4 程序集合
💻 CPP
字号:

#include "httpget.h"

HttpGet::HttpGet(QObject *parent)
	: QObject(parent)
{
	http = new QHttp(this);
	connect(http,SIGNAL(done(bool)),this,SLOT(httpDone(bool)));
	connect(http, SIGNAL(requestFinished(int, bool)),
		this, SLOT(httpRequestFinished(int, bool)));
	connect(http, SIGNAL(dataReadProgress(int, int)),
		this, SLOT(updateDataReadProgress(int, int)));
	connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
		this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
}

HttpGet::~HttpGet()
{

}

bool HttpGet::downloadFile(QUrl url)
{
	QFileInfo fileInfo(url.path());
	fileName = fileInfo.fileName();

	if (QFile::exists(fileName)) {
		qDebug()<<tr("当前路径下文件 %1 已存在。")
			.arg(fileName);
		httpRequestAborted = true;
		return false;
	}

	file = new QFile(fileName);
	if (!file->open(QIODevice::WriteOnly)) {
		qDebug()<<tr("无法保存文件 %1: %2.")
			.arg(fileName).arg(file->errorString());
		delete file;
		file = 0;
		httpRequestAborted = true;
		return false;
	}

	http->setHost(url.host(), url.port() != -1 ? url.port() : 80);
	if (!url.userName().isEmpty())
		http->setUser(url.userName(), url.password());
	
	httpGetId = http->get(url.path(), file);
	httpRequestAborted = false;
	return true;
}

void HttpGet::httpRequestFinished(int requestId, bool error)
{
	if (httpRequestAborted) {
		if (file) {
			file->close();
			file->remove();
			delete file;
			file = 0;
		}
		return;
	}

	if (requestId != httpGetId)
		return;

	file->close();

	if (error) {
		file->remove();
		qDebug()<<tr("下载文件失败: %1")
			.arg(http->errorString());
	} else {
		qDebug()<<tr("文件%1 下载完毕。").arg(fileName);
	}
	delete file;
	file = 0;
}

void HttpGet::readResponseHeader(const QHttpResponseHeader &responseHeader)
{
	qDebug()<<responseHeader.statusCode();
	if (responseHeader.statusCode() != 200) {//请求成功。
		qDebug()<<tr("下载失败:%1。")
			.arg(responseHeader.reasonPhrase());
		httpRequestAborted = true;
		http->abort();
		return;
	}
}

void HttpGet::updateDataReadProgress(int bytesRead, int totalBytes)
{
	if (httpRequestAborted)
		return;
	qDebug()<<tr("已下载:%1%").arg(100*bytesRead/totalBytes);
}

void HttpGet::httpDone(bool error)
{
	if(error){
		qDebug()<<tr("错误:")<<qPrintable(http->errorString())<<endl;
	}
	emit done();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -