今天来把坑填上。 
具体就是提供一个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下载文件的接口实现的更多相关文章

  1. 从指定的URL下载文件

    通过使用URLDownLoadToFile函数,我们能从指定的URL下载文件,保存到本地,并且下载的文件类型可以是可执行文件 实例如下,http://www.xuexic.com 的根目录下存在一个l ...

  2. 根据URL下载文件

    commons-io 包中已经封装好了,直接可以使用 一.添加依赖 <dependency> <groupId>org.apache.commons</groupId&g ...

  3. wget---从指定的URL下载文件

    wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...

  4. Java从指定URL下载文件并保存到指定目录

    1.基本流程 当我们想要下载网站上的某个资源时,我们会获取一个url,它是服务器定位资源的一个描述,下载的过程有如下几步: (1)客户端发起一个url请求,获取连接对象. (2)服务器解析url,并且 ...

  5. 前端通过url下载文件方法

    前端通过url下载文件方法 产生背景 浏览器通过url下载文件,当浏览器识别出资深能播放的资源文件,就不会走下载流程,会直接打开 解决方法 1.让后台转成请求的方式,输出文件流(如果想实现批量下载-因 ...

  6. HttpClient实现通过url下载文件

    其实就是通过浏览器url,点击就会下载文件. 这里是从代码层面上,对文件进行下载. package main.java.com.abp.util; import org.apache.http.*; ...

  7. 根据文件url,下载文件到本地

    /// <summary> /// 根据文件url,下载文件到本地 /// </summary> /// <param name="fileUrl"& ...

  8. QT:多线程HTTP下载文件

    这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器 ...

  9. 如何应对POST方式下载文件的接口

    jQuery的下载,需要承载一个插件去做 今天遇到一个问题,后台给的接口由于需要前端传入过多的参数,只能接受用post去下载文件.正常情况下第一反应是用xhr对象去发送post请求,结果并没有触发浏览 ...

随机推荐

  1. C++中常用特殊符号简介(& , * , : , :: , ->)

    1."&"一般表示:引用,按位与,取地址. 如: class Complex { public: Complex operator+(Complex &c2) .. ...

  2. FlashFXP使用教程

    点FlashFXP菜单栏“站点-站点管理”打开站点管理器.然后点新建站点,输入站点名称(随意),确定.   编辑站点管理器里新建的站点的相关信息,包括站点名称.地址.用户名称.密码等.编辑完成,点应用 ...

  3. Csharp多态的实现概述

    (1)什么是多态, 多态就是一个类表现出多种不同的形态, 他的核心是子类对象作为父类对象使用 (2)怎么实现多态, 在Csharp中,可以用接口, 虚方法, 抽象类实现多态,当然,不管是这三种的那一个 ...

  4. 网络技术教程笔记(18)常见广域网技术——X.25与郑中基技术(←_←搜狗输入法你够了)

    广域网与接入网技术 广域网与接入网技术 常见广域网技术--X.25 产生背景 尽管在当时,苹果二代计算机已经取得了很大的成功,但是PC和工作站却没有流行,也没有获得很多的网络支持,大多数人还是使用便宜 ...

  5. bzoj 2542: [Ctsc2001]终极情报网 费用流

    题目链接 2542: [Ctsc2001]终极情报网 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 321  Solved: 125[Submit][S ...

  6. [LeetCode]题解(python):144-Binary Tree Preorder Traversal

    题目来源: https://leetcode.com/problems/binary-tree-preorder-traversal/ 题意分析: 前序遍历一棵树,递归的方法很简单.那么非递归的方法呢 ...

  7. IOS 特定于设备的开发:获取额外的设备信息

    sysctl()和sysctlbyname()允许获取系统信息.这些标准的UNIX函数用于询问操作系统有关硬件和OS的详细信息. 这些常量使你能够检查核心信息,比如系统的CPU频率,可用的内存量等.它 ...

  8. 阿里云ECS每天一件事D4:安装mysql5.5.40

    Linux平台上MySQL也没什么好说的了,首先准备一下软件环境: yum install gcc gcc-c++ gcc-g77 autoconf automake make cmake bison ...

  9. 理解angular中的module和injector,即依赖注入

    理解angular中的module和injector,即依赖注入 依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是java ...

  10. MFC 动态创建控件

    动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的.   一.创建动态控件:   为了对照,我们先来看一下静态控件的创建.   放置静态控件时必须先建立一个容器,一 ...