本節jwisp爲你們舉例說明若是使用上節介紹的函數和參數,在使用libcurl的過程當中,如何獲取下載目標文件的大小 , 下載進度條,斷點續傳等,這些基本的函數,將爲jwisp在最後處理下載過程異常中斷等問題提供支持.java
1. 編寫獲得下載目標文件的大小的函數curl
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. 下載中回調本身寫的獲得下載進度值的函數函數
下載回調函數的原型應該爲:url
int progressFunc(const char* flag, double dtotal, double dnow, double ultotal, double ulnow);
.net
a. 應該在外部聲明一個遠程下載文件大小的全局變量orm
double downloadFileLenth = 0;
blog
爲了斷點續傳, 還應該聲明一個本地文件大小的全局變量get
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));