#include <QtCore>
#include <QtNetwork>
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "downloadObject.h"
downloadObject::downloadObject(QObject *parent)
: QObject(parent)
{
http = new QHttp(this);
//resp = new QHttpResponseHeader();
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
connect(http, SIGNAL(dataReadProgress(int,int)),
this, SLOT(updateProgress(int,int)));
}
bool downloadObject::getFile(const QUrl &url,const qint64 totalSizet)
{
if (!url.isValid()) {
std::cerr << "Error: Invalid URL" << std::endl;
return false;
}
if (url.scheme() != "http") {
std::cerr << "Error: URL must start with 'http:'" << std::endl;
return false;
}
if (url.path().isEmpty()) {
std::cerr << "Error: URL has no path" << std::endl;
return false;
}
localFileName = QFileInfo(url.path()).fileName();
if (localFileName.isEmpty())
localFileName = "httpget.out";
file.setFileName(localFileName);
qint64 dwSize = 0;
totalSize = totalSizet;
// if(file.exists())//这边我取了个非
// {
dwSize = file.size();
beforeSize = dwSize;
if (!file.open(QIODevice::Append)) {
std::cerr << "Error: Cannot write file "
<< qPrintable(file.fileName()) << ": "
<< qPrintable(file.errorString()) << std::endl;
return false;
}
QHttp::ConnectionMode mode = url.scheme().toLower() == "https" ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp;
http->setHost(url.host(), mode, url.port() == -1 ? 0 : url.port());
// qint64 totalSize = http->bytesAvailable();
/*http->setHost(url.host(), ,url.port(80));*/
QHttpRequestHeader *header = new QHttpRequestHeader("GET", url.path());
header->setValue("Connection", "Keep-Alive");
QString str = "bytes=";
QString strTemp = QString("%1").arg(dwSize);
str+=strTemp;
// dwSize += 100;
if (dwSize>totalSize)
{
dwSize = totalSize;
}
str+="-";
strTemp = QString("%1").arg(totalSize);
str += strTemp;
header->setValue("Range", str);
strTemp = url.host()+":80";
header->setValue("Host", strTemp);
http->request(*header, 0, &file);
http->close();
return true;
// }
}
void downloadObject::abort()
{
http->abort();
file.close();
//return;
}
void downloadObject::httpDone(bool error)
{
if (error) {
QString sre = http->errorString();
std::cerr << "Error: " << qPrintable(http->errorString())
<< std::endl;
} else {
std::cerr << "File downloaded as "
<< qPrintable(file.fileName()) << std::endl;
}
file.close();
emit downloadDone();
}
void downloadObject::updateProgress(int current, int all)
{
if(current<0)
{
current = 0;
}
if(beforeSize<0)
{
beforeSize = 0;
}
current = beforeSize+current;
emit updateProgressbar(current, totalSize);
}
qint64 downloadObject::fileGetSize(const QUrl &url)
{
//QString strUrl = ui->lineEditURL->text();
//QUrl url = QUrl(strUrl);
QNetworkAccessManager manager;
QEventLoop loop;
//发出请求,获取目标地址的头部信息
QNetworkReply *reply = manager.head(QNetworkRequest(url));
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()), Qt::DirectConnection);
loop.exec();
QVariant var = reply->header(QNetworkRequest::ContentLengthHeader);
delete reply;
qint64 size = var.toLongLong();
//ui->lineEditGetSize->setText(QString::number(size));
return size;
}
QT HTTP断点续传下载(非多线程)
5星 · 超过95%的资源 需积分: 13 59 浏览量
2012-04-21
09:24:40
上传
评论 1
收藏 1.34MB RAR 举报
疯狂的咸蛋
- 粉丝: 10
- 资源: 3
最新资源
- 基于Python实现的自动化办公项目.zip
- 基于python实现的基于PyQt5和爬虫的小说阅读系统.zip
- 机械设计整经机上纱自动化sw20非常好的设计图纸100%好用.zip
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页