(二)使用libcurl實現獲取目標文件大小, 下載進度顯示, 斷點續傳等功能

本節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));      

相關文章
相關標籤/搜索