QT实现,通过URL下载文件的接口实现
今天来把坑填上。
具体就是提供一个URL,并通过这个URL下载文件。
MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H
class MyDownloader :public QObject
{
Q_OBJECT
public:
//构造函数,要求下载地址,保存位置,进度条(可选)
MyDownloader();
~MyDownloader();
// 设置要下载的url和文件名
void setData(QUrl url, QString pathtoSave);
//开始下载
void getFile();
void startRequest(QUrl url);
//发生的错误代码
int lastError();
//返回是否有错误发生
bool errorValid();
//返回是否下载中
bool isRunning();
//返回是否下载完成
bool isFinished();
//返回所下载文件的版本号
QString getDownloadVersionCode();
//返回所下载文件的名字(带扩展名)
QString getFileName();
void cancel();
private:
//=====状态变量=====
bool bisFinished; //下载是否完成
bool bisRunning; //下载是否进行中
bool bisError; //是否有错误发生
int errorCode; //错误代码
int allBits = 0; //文件大小
bool httpRequestAborted;
//=====对象声明=====
QFile *downloadFile; //保存目标文件指针
QUrl downloadUrl; //下载地址Url
QString savePath; //文件存放路径
QString versionCode = ""; //所下载的文件版本号
QString fileName = ""; //所下载文件名
QNetworkReply *downloadReply; //网络应答指针
QNetworkAccessManager downloadmanager; //网络连接主类指针
signals:
//当错误发生时向外抛出错误信息
void error(QNetworkReply::NetworkError);
//抛出下载进度(更新进度条)
void updateProgress(qint64, qint64);
//下载结果 0成功 其他失败
void downloadResult(int retCode);
private slots:
//准备下载,读取数据
void downloadReadyRead();
//下载完成
void downloadFinished();
//下载过程中发生错误
void downloadError(QNetworkReply::NetworkError);
//下载过程进度条
void downloadProgress(qint64, qint64);
};
#endif// MYDOWNLOADER_H
具体实现:
MyDownloader.cpp:
MyDownloader::MyDownloader()
{
downloadFile = NULL;
downloadReply = NULL;
bisFinished = false;
}
MyDownloader::~MyDownloader()
{
cancel();
}
void MyDownloader::setData(QUrl url, QString pathtoSave)
{
downloadUrl = url;
savePath = pathtoSave;
}
void MyDownloader::getFile()
{
if (savePath.isEmpty() || downloadUrl.isEmpty())
{
return;
}
if (downloadFile)
{
return;
}
bisFinished = false;
downloadFile = new QFile(savePath);
if (!downloadFile->open(QIODevice::WriteOnly))
{
delete downloadFile;
downloadFile = 0;
return;
}
allBits = downloadFile->size();
httpRequestAborted = false;
//尝试获取文件
startRequest(downloadUrl);
//事件循环,防止在下载没完成前结束对象
}
void MyDownloader::startRequest(QUrl url)
{
QNetworkRequest req(url);
if (allBits)
{
//QByteArray rangeHeaderValue = "bytes=" + QByteArray::number(allBits) + "-";// + QByteArray::number(already + cUpdateChunk() - 1);
//req.setRawHeader("Range", rangeHeaderValue);
//req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
//req.setRawHeader("RANGE", tr("bytes=%1-").arg(allBits).toUtf8());//
}
downloadReply = downloadmanager.get(req);
//连接信号与槽
if (downloadReply)
{
connect(downloadReply, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
connect(downloadReply, SIGNAL(finished()), this, SLOT(downloadFinished()));
//connect(downloadReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
}
}
QString MyDownloader::getDownloadVersionCode()
{
return versionCode;
}
QString MyDownloader::getFileName()
{
return fileName;
}
void MyDownloader::downloadReadyRead()
{
//如果文件可以访问,下载
if (downloadFile)
downloadFile->write(downloadReply->readAll());
}
void MyDownloader::downloadProgress(qint64 bytesRead, qint64 totalBytes)
{
}
void MyDownloader::cancel()
{
if (downloadFile)
{
downloadFile->close();
delete downloadFile;
downloadFile = NULL;
}
if (downloadReply)
{
downloadReply->deleteLater();
downloadReply = NULL;
}
}
void MyDownloader::downloadFinished()
{
if (httpRequestAborted)
{
cancel();
return;
}
downloadFile->flush();
downloadFile->close();
QVariant redirectionTarget = downloadReply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (downloadReply->error())
{//299提示RANGE错误
DEBUG_LOG(qsl("downloadReply error code:") + QString::number(downloadReply->error()));
//downloadFile->remove();
//emit downloadResult(-1);
}
else if (!redirectionTarget.isNull())
{
QUrl newUrl = downloadUrl.resolved(redirectionTarget.toUrl());
{
downloadUrl = newUrl;
downloadReply->deleteLater();
downloadFile->open(QIODevice::WriteOnly);
downloadFile->resize(0); allBits = 0;
startRequest(downloadUrl);
return;
}
}
else
{
QString fileName = QFileInfo(downloadUrl.path()).fileName();
delete downloadFile;
downloadFile = 0;
bisFinished = true;
emit downloadResult(0);
}
downloadReply->deleteLater();
downloadReply = 0;
if (downloadFile)
{
delete downloadFile;
downloadFile = 0;
}
}
void MyDownloader::downloadError(QNetworkReply::NetworkError errorcode)
{
emit downloadResult(-1);
}
bool MyDownloader::errorValid()
{
return false;
}
int MyDownloader::lastError()
{
return 0;
}
bool MyDownloader::isRunning()
{
return false;
}
bool MyDownloader::isFinished()
{
return bisFinished;
}
有些方法没有具体实现,(现在没有用到),是否有错误发生,判断是否下载中,是否下载完成,等
//////////////////////////////////////////////////////////////////////
使用:
mian.cpp void main() { MyDownloader m_downLoder; m_downLoder.setData(QUrl(m_si.custInfo.szLogoLargeUrl.c_str()), bigLogoPath); m_downLoder.cancel(); m_downLoder.getFile(); }
//////////////////////////////////////////////////////////////////////////////////////
全文完
http://blog.csdn.net/u011915578/article/details/46592963
QT实现,通过URL下载文件的接口实现的更多相关文章
- 从指定的URL下载文件
通过使用URLDownLoadToFile函数,我们能从指定的URL下载文件,保存到本地,并且下载的文件类型可以是可执行文件 实例如下,http://www.xuexic.com 的根目录下存在一个l ...
- 根据URL下载文件
commons-io 包中已经封装好了,直接可以使用 一.添加依赖 <dependency> <groupId>org.apache.commons</groupId&g ...
- wget---从指定的URL下载文件
wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...
- Java从指定URL下载文件并保存到指定目录
1.基本流程 当我们想要下载网站上的某个资源时,我们会获取一个url,它是服务器定位资源的一个描述,下载的过程有如下几步: (1)客户端发起一个url请求,获取连接对象. (2)服务器解析url,并且 ...
- 前端通过url下载文件方法
前端通过url下载文件方法 产生背景 浏览器通过url下载文件,当浏览器识别出资深能播放的资源文件,就不会走下载流程,会直接打开 解决方法 1.让后台转成请求的方式,输出文件流(如果想实现批量下载-因 ...
- HttpClient实现通过url下载文件
其实就是通过浏览器url,点击就会下载文件. 这里是从代码层面上,对文件进行下载. package main.java.com.abp.util; import org.apache.http.*; ...
- 根据文件url,下载文件到本地
/// <summary> /// 根据文件url,下载文件到本地 /// </summary> /// <param name="fileUrl"& ...
- QT:多线程HTTP下载文件
这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器 ...
- 如何应对POST方式下载文件的接口
jQuery的下载,需要承载一个插件去做 今天遇到一个问题,后台给的接口由于需要前端传入过多的参数,只能接受用post去下载文件.正常情况下第一反应是用xhr对象去发送post请求,结果并没有触发浏览 ...
随机推荐
- OC 中的block使用
在iOS的开发过程中,使用块的地方很多也很方便,但是在使用块的过程中要注意内存泄露的问题. 在块创建的时候,会对块内的所有对象的引用计数加一,直到块销毁,所以在使用块的过程中需要我们进行处理,在这里以 ...
- IOS-将长文字转化成图片方法
我们在看微博时,会看到一些长图片上的显示文章,现在就介绍下如何实现.分析下还是很简单的,总结如下:1.计算文字区域的高 2.利用UIGraphics图形上下文方法来实现 3.验证方法:UIImageW ...
- oracle中区分audit_file_dest, background_dump_dest, core_dump_dest, user_dump_dest
一般在$ORACLE_HOME\admin\{SID}目录下: audit_file_dest = /u01/app/oracle/admin/{SID}/adump ...
- php中的require-once
require_once语句和require语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含. 参见include_once的文档来理解_once的含义,并理解与没 ...
- java简易编辑器
package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swi ...
- PhpStorm 10.0 激活方式
随着 JetBrains 新版本的发布,注册机已然不行了.然而,道高一尺,魔高一丈.IntelliJ IDEA开源社区 提供了如下通用激活方法:注册时选择License server填写http:// ...
- .net mvc笔记3_Understanding Razor Syntax
Understanding Razor Syntax MVC3新视图引擎的名字叫做Razor.ASP.NET视图引擎处理web页面,寻找包含在服务器端指令的特殊元素.正如我们前面已经提到的,标准的AS ...
- Dos命令之Netsh
NetSH (Network Shell) 是windows系统本身提供的功能强大的网络配置命令行工具. 常用命令 1. 导出配置脚本:netsh -c interface ip dump > ...
- linux 6.4平台利用rman迁移oracle 11g r2数据库
测试环境分别在虚拟机安装A,B主机 系统:linux 6.4, 数据库:oracle 11g r2 A主机:安装oracle 11g r2数据库 B主机:只安装oracle 11g r2软件 第一步, ...
- ICT测试原理
在线测试,ICT,In-Circuit Test,是通过对在线元器件的电性能及电气连接进行测试来检查生产制造缺陷及元器件不良的一种标准测试手段.它主要检查在线的单个元器件以及各电路网络的开.短路情况, ...