(二)操作libcurl实现获取目的文件大小, 下载进度显示, 断点续传
2013-08-01 17:36
633 查看
各位亲 有时间可以去看看我的 “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦
还有意外礼品赠送 真正的程序员淘宝店
本节jwisp为大家举例分析假设操作上节引见的函数和参数,在操作libcurl的进程中,如何获取下载目的文件的大小 , 下载进度条,断点续传等, 这些基本的函数,将为jwisp在最后解决下载进程异样中缀等效果提供反对.
1. 编写失去下载目的文件的大小的函数
long getDownloadFileLenth(const char *url){
long downloadFileLenth = 0;
CURL *handle = curl_easy_init();
curl_easy_setopt(handle, CURLOPT_URL, url);
curl_easy_setopt(handle, CURLOPT_HEADER, 1); //只要求header头
curl_easy_setopt(handle, CURLOPT_NOBODY, 1); //不需求body
if (curl_easy_perform(handle) == CURLE_OK) {
curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);
} else {
downloadFileLenth = -1;
}
return downloadFileLenth;
}
2. 下载中回调本身写的失去下载进度值的函数
下载回调函数的原型应该为:
int progressFunc(const char* flag, double dtotal, double dnow, double ultotal, double ulnow);
a. 应该在内部申明一个长途下载文件大小的全局变量
double downloadFileLenth = 0;
为了断点续传, 还应该申明一个当地文件大小的全局变量
double localFileLenth = 0;
b. 编写一个失去进度值的函数getProgressValue()
int getProgressValue(const char* flag, double dt, double dn, double ult, double uln){
double showTotal, showNow;
if (downloadFileLenth == 0){
downloadFileLenth = getDownloadFileLenth(url);
}
showTotal = downloadFileLenth;
if (localFileLenth == 0){
localFileLenth = getLocalFileLenth(filePath);
}
showNow = localFileLenth + dn;
//而后就可能调用你本身的进度显示函数了,这里假定已经有一个进度函数, 那么只要求传递当前下载值和总下载值即可.
showProgressValue(showNow, showTotal);
}
c. 在下载中停止三个下载参数的设置
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(handle, CURLOPT_PROGRESSFUNCTION, getProgressValue); //设置回调的进度函数
curl_easy_setopt(handle, CURLOPT_PROGRESSDATA, “flag”); //此设置对应上面的const char *flag
3. 断点续传
用libcurl实现断点续传很简略,只用两步即可实现, 一是要失去当地文件已下载的大小,通过函数getLocalFileLenth()方法来失去,二是设置CURLOPT_RESUME_FROM_LARGE参数的值为已下载当地文件大小.
失去当地文件大小的函数:
long getLocalFileLenth(const char* localPath);
设置下载点如下即可:
curl_easy_setopt(handle, CURLOPT_RESUME_FROM_LARGE, getLocalFileLenth(localFile));
还有意外礼品赠送 真正的程序员淘宝店
本节jwisp为大家举例分析假设操作上节引见的函数和参数,在操作libcurl的进程中,如何获取下载目的文件的大小 , 下载进度条,断点续传等, 这些基本的函数,将为jwisp在最后解决下载进程异样中缀等效果提供反对.
1. 编写失去下载目的文件的大小的函数
long getDownloadFileLenth(const char *url){
long downloadFileLenth = 0;
CURL *handle = curl_easy_init();
curl_easy_setopt(handle, CURLOPT_URL, url);
curl_easy_setopt(handle, CURLOPT_HEADER, 1); //只要求header头
curl_easy_setopt(handle, CURLOPT_NOBODY, 1); //不需求body
if (curl_easy_perform(handle) == CURLE_OK) {
curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);
} else {
downloadFileLenth = -1;
}
return downloadFileLenth;
}
2. 下载中回调本身写的失去下载进度值的函数
下载回调函数的原型应该为:
int progressFunc(const char* flag, double dtotal, double dnow, double ultotal, double ulnow);
a. 应该在内部申明一个长途下载文件大小的全局变量
double downloadFileLenth = 0;
为了断点续传, 还应该申明一个当地文件大小的全局变量
double localFileLenth = 0;
b. 编写一个失去进度值的函数getProgressValue()
int getProgressValue(const char* flag, double dt, double dn, double ult, double uln){
double showTotal, showNow;
if (downloadFileLenth == 0){
downloadFileLenth = getDownloadFileLenth(url);
}
showTotal = downloadFileLenth;
if (localFileLenth == 0){
localFileLenth = getLocalFileLenth(filePath);
}
showNow = localFileLenth + dn;
//而后就可能调用你本身的进度显示函数了,这里假定已经有一个进度函数, 那么只要求传递当前下载值和总下载值即可.
showProgressValue(showNow, showTotal);
}
c. 在下载中停止三个下载参数的设置
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(handle, CURLOPT_PROGRESSFUNCTION, getProgressValue); //设置回调的进度函数
curl_easy_setopt(handle, CURLOPT_PROGRESSDATA, “flag”); //此设置对应上面的const char *flag
3. 断点续传
用libcurl实现断点续传很简略,只用两步即可实现, 一是要失去当地文件已下载的大小,通过函数getLocalFileLenth()方法来失去,二是设置CURLOPT_RESUME_FROM_LARGE参数的值为已下载当地文件大小.
失去当地文件大小的函数:
long getLocalFileLenth(const char* localPath);
设置下载点如下即可:
curl_easy_setopt(handle, CURLOPT_RESUME_FROM_LARGE, getLocalFileLenth(localFile));
相关文章推荐
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- 使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- Android使用OKHttp3实现下载(断点续传、显示进度)
- 获取下载文件的大小,从而设置下载进度条
- libcurl开源库在Win32程序中使用下载文件显示进度条实例
- 实现文件下载并且显示下载进度
- 使用OKHttp3实现下载(断点续传、显示进度)
- 基于Retrofit+Rxjava实现带进度显示的下载文件
- libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)
- OKHTTP_三行代码实现文件下载(dialog显示进度)
- libcurl 通过http协议下载文件并显示下载进度
- jquery uploadify 实现批量上传,带进度显示,判断文件大小
- Linux系统遍历文件夹 获取文件大小的操作(C语言实现)
- C#下载文件(可显示进度)的方法实现
- php实现显示文件下载大小
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息
- Android使用OKHttp3实现下载(断点续传、显示进度)
- 详解Android使用OKHttp3实现下载(断点续传、显示进度)
- ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)
- Android使用OKHttp3实现下载(断点续传、显示运行进度)