1. 程式人生 > >(二)使用libcurl實現獲取目標檔案大小, 下載進度顯示, 斷點續傳等功能

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

本節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實現獲取目標檔案大小, 下載進度顯示, 斷點功能

本節jwisp為大家舉例說明如果使用上節介紹的函式和引數,在使用libcurl的過程中,如何獲取下載目標檔案的大小 , 下載進度條,斷點續傳等,這些基本的函式,將為jwisp在最後處理下載過程異常中斷等問題提供支援. 1.      編寫得到下載目標檔案的大小的函式 lo

分享個C++封裝Libcurl程式碼(支援下載檔案、GET\POST、重定向斷點功能

前言 前面分享過一個Windows上封裝Winhttp和WinInet API的程式碼,結果下載頁好評特別多(呵呵),謝謝大家賞臉。文章地址:開源一個C++實現的簡單HTTP協議處理庫,裡面有程式碼資源下載地址。但是,在實際開發過程中我發現WinHttp API嚴重依賴微

Retrofit下載檔案、監聽進度斷點

前些天有個同學問我會不會使用Retrofit下載大檔案,我就給了他我專案中使用的方法。發現有很多人還不會用Retrofit實現下載檔案,即使會下載,也可能會出現問題,比如:不知道如何獲取進度;一旦下載大檔案就會OOM;不知道如何暫停下載,或者不知道如何實現斷點續傳等。今天這個

java使用WebUploader做大檔案的分塊和斷點

前言: WebUploader是由Baidu WebFE(FEX)團隊開發的一個簡單的以HTML5為主,FLASH為輔的現代檔案上傳元件。在現代的瀏覽器裡面能充分發揮html5的優勢,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH執行時,相容IE6+,iOS 6+, 

用scp後臺傳輸檔案,用rsync進行斷點

1. scp後臺傳輸檔案 用nohup命令 $nohup scp file [email protected]:/file > nohup.out 2>&1  輸入

C#如何操控FTP,獲取FTP檔案或資料夾列表,獲取FTP檔案大小,FTP上,FTP刪除檔案,FTP新建資料夾、刪除資料夾

C#如何操控FTP 出處:http://www.cnblogs.com/rond/archive/2012/07/30/2611295.html,http://www.cnblogs.com/rond   關於FTP的應用免不了要對FTP進行增刪查改什麼的。通過搜尋,整理和修改

Java servlet 簡單實現http檔案下載斷點功能

斷點續傳,聽上去似乎是個比較高階的話題,本文只講述一下http版的斷點續傳,其他協議的大家可以自行研究。 http協議中,服務端實現斷點續傳首先需要讀取客戶端傳送的Range頭資訊,比如“Range: bytes=12583394-”這個就是指原來正在下載的檔案需要從第12

java web 實現多個檔案壓縮下載

檔案下載時,我們可能需要一次下載多個檔案。批量下載檔案時,需要將多個檔案打包為zip,然後再下載。實現思路有兩種:一是將所有檔案先打包壓縮為一個檔案,然後下載這個壓縮包,二是一邊壓縮一邊下載,將多個檔案逐一寫入到壓縮檔案中。我這裡實現了邊壓縮邊下載。 下載樣式: 點選下載

Android 實現多執行緒下載檔案+斷點

                            Android 多執行緒下載檔案+斷點續傳       在專案快要結束的時候,發現了app沒有版本更新的功能,於是找到一些過去的資料,在app上應用完成了版本更新,現在記錄一下apk的下載,也就是如何通過多執行緒將ap

Android okhttp+rxjava實現檔案下載斷點

         首先先感謝丰神,核心程式碼源於他的這篇微博http://blog.csdn.net/cfy137000/article/details/54838608,思路很棒。基於他的程式碼做了一些改動,實現我所需功能。       先說下我的需求。我的需求是PC端

Python實現斷點下載檔案,大檔案下載還怕下載到一半就斷了嗎?不存在!

這篇部落格簡單介紹python斷點續傳下載檔案,並加入花哨的下載進度顯示方法,涉及Python檔案操作的技巧,和一些函式庫的使用。 環境 Python 3.6 requests模組 對應檔案的下載連結 (要下載的檔案必須支援斷點續傳) (是不是很少東西

springmvc 後臺實現監聽上檔案大小進度

一、首先需要自定義一個監聽進度的listener       import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.Progres

用java實現檔案斷點併發下載

說明 用java實現檔案的斷點續傳,使用了HTTP的首部欄位實現,在網上看到例子,手動實現一遍,理解其原理,在這記錄下 正文 要實現斷點續傳,要在請求中設定請求開始的位置和結束位置,在HTTP請求中設定RANGE首部欄位,之後伺服器如果能正常返回,返回

C#檔案下載實現斷點

1 public class WebDown 2 { 4 /// 下載檔案方法 6 /// 檔案儲存路徑和檔名 7 /// 返回伺服器檔名 9 public static bool DeownloadFil

C#實現http多執行緒斷點下載檔案

using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Net; using u8 = System.Byte; using

python實現斷點下載檔案

最近的任務裡有一個功能是要我從日誌伺服器實時跟新日誌到本地,日誌在不斷新增內容就需要我隔一段時間從上次下載的位置繼續下載,並寫入本地檔案上次寫完的位置後面。 headers = {'Range': 'bytes=%d-' % local_f

Android檔案下載實現斷點

http://www.ideasandroid.com/archives/328#more-328 本文將介紹在android平臺下如何實現多執行緒下載,大家都知道,android平臺使用java做為開發語言,所以java中支援的多執行緒下載方式在android平臺下都支援,

PHP獲取遠端檔案大小 如果加判斷檔案大小以KB MB GB

<?php function sizecount($filesize) { if($filesize >= 1073741824) { $filesize = round($filesize / 1073741824 * 100) / 100 . ' g

java實現多個檔案打包下載

最近需要做一個多檔案打包zip下載的需求,能力不足,完全無處下手,百度大法到了這個方法,轉載至此,以備後用。 親測有效,直接把方法貼上至專案就可以。 List<File> 需要先做一些操作,可以另寫一個方法,判斷手中的路徑是否為空,然後直接呼叫downLoadF

IOS 下載檔案斷點原理與實現(附原始碼)

在網路狀況不好的情況下,對於檔案的傳輸,我們希望能夠支援可以每次傳部分資料。首先從檔案傳輸協議FTP和TFTP開始分析, FTP是基於TCP的,一般情況下建立兩個連線,一個負責指令,一個負責資料;而TFTP是基於UDP的,由於UDP傳輸是不可靠的,雖然傳輸速度很快,但對於普通的檔案像PDF這種,少了一個