使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
2013-08-14 10:15
1276 查看
文章转自:/article/9942719.html
本节jwisp为大家举例说明如果使用上节介绍的函数和参数,在使用libcurl的过程中,如何获取下载目标文件的大小 ,下载进度条,断点续传等,这些基本的函数,将为jwisp在最后处理下载过程异常中断等问题提供支持.
1. 编写得到下载目标文件的大小的函数
[cpp] view
plaincopy
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. 下载中回调自己写的得到下载进度值的函数
下载回调函数的原型应该为:
[cpp] view
plaincopy
int progressFunc(const char* flag, double dtotal, double dnow, double ultotal, double ulnow);
a. 应该在外部声明一个远程下载文件大小的全局变量
[cpp] view
plaincopy
double downloadFileLenth = 0;
为了断点续传, 还应该声明一个本地文件大小的全局变量
[cpp] view
plaincopy
double localFileLenth = 0;
b. 编写一个得到进度值的函数getProgressValue()
[cpp] view
plaincopy
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. 在下载中进行三个下载参数的设置
[cpp] view
plaincopy
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参数的值为已下载本地文件大小.
得到本地文件大小的函数:
[cpp] view
plaincopy
long getLocalFileLenth(const char* localPath);
设置下载点如下即可:
[cpp] view
plaincopy
curl_easy_setopt(handle, CURLOPT_RESUME_FROM_LARGE, getLocalFileLenth(localFile));
本节jwisp为大家举例说明如果使用上节介绍的函数和参数,在使用libcurl的过程中,如何获取下载目标文件的大小 ,下载进度条,断点续传等,这些基本的函数,将为jwisp在最后处理下载过程异常中断等问题提供支持.
1. 编写得到下载目标文件的大小的函数
[cpp] view
plaincopy
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. 下载中回调自己写的得到下载进度值的函数
下载回调函数的原型应该为:
[cpp] view
plaincopy
int progressFunc(const char* flag, double dtotal, double dnow, double ultotal, double ulnow);
a. 应该在外部声明一个远程下载文件大小的全局变量
[cpp] view
plaincopy
double downloadFileLenth = 0;
为了断点续传, 还应该声明一个本地文件大小的全局变量
[cpp] view
plaincopy
double localFileLenth = 0;
b. 编写一个得到进度值的函数getProgressValue()
[cpp] view
plaincopy
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. 在下载中进行三个下载参数的设置
[cpp] view
plaincopy
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参数的值为已下载本地文件大小.
得到本地文件大小的函数:
[cpp] view
plaincopy
long getLocalFileLenth(const char* localPath);
设置下载点如下即可:
[cpp] view
plaincopy
curl_easy_setopt(handle, CURLOPT_RESUME_FROM_LARGE, getLocalFileLenth(localFile));
相关文章推荐
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- (二)操作libcurl实现获取目的文件大小, 下载进度显示, 断点续传
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- NSOperation 的使用(下载相关) 图片和文件都是可以的 断点续传 图片逐渐显示
- 文件批量上传的工具,要实现暂停继续、断点续传等功能(使用QtNetwork和QHttpMultiPart,和定时器检查超时)
- ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)
- (四)使用Libcurl下载文件,解决无信号中断,下载中掉电恢复后断点续传问题的源代码
- libcurl 实现文件断点续传功能
- ios断点续传:通过NSURLSession实现文件下载功能
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
- Android实现文件下载进度显示功能
- 微信小程序使用progress组件实现显示进度功能【附源码下载】
- Android中使用AsyncTask实现下载文件动态更新进度条功能
- iOS开发-使用NSURLSession实现文件断点下载,文件离线续传以及图片上传
- HTML5_纯JS实现上传文件显示文件大小,文件信息,上传进度_不使用JS库
- 阿里云客户端的实现(支持文件分块,断点续传,进度,速度,倒计时显示)