1. 程式人生 > >libcurl實現斷點續傳

libcurl實現斷點續傳

實現斷點續傳主要就是通過curl_easy_setopt設定好CURLOPT_RESUME_FROM_LARGE屬性完成

首先獲取已下載檔案大小,然後設定CURLOPT_RESUME_FROM_LARGE屬性,從指定位元組開始下載

#include <sys/stat.h>
// Get the local file size,return -1 if failed
_off_t getLocalFileLength(string path)
{
	_off_t ret;
	struct stat fileStat;

	ret = stat(path.c_str(), &fileStat);
	if (ret == 0)
	{
		return fileStat.st_size;
	}

	return ret;
}
curl_off_t resumeByte = getLocalFileLength("test10.zip"); // 本地已下載檔案的位元組大小,確保resumeByte型別為curl_off_t(Windows平臺為long long,Mac為long)否則容易出錯
int ret = curl_easy_setopt(easy_handle, CURLOPT_RESUME_FROM_LARGE, resumeByte);

resumeByte的型別不對或者超過了伺服器檔案的Content-Length時,curl_easy_perform都會返回錯誤

下次開始時,將會從指定的位元組位置開始下載。

計算下載進度時需要注意一點,dltotal得到的不是伺服器上檔案的大小,而是還需要下載位元組的大小,也就是說dototal並不是test10.zip這個檔案的大小,而是test10.zip的大小減去本地已經下載的大小。

那麼如何得到伺服器上的檔案大小,我們可以通過libcurl傳送請求header,返回的Content-Length就是檔案大小

// 獲取伺服器上的檔案大小
double getDownloadFileLength(string url)
{
	CURL *easy_handle = NULL;
	int ret = CURLE_OK;
	double size = -1;

	do
	{
		easy_handle = curl_easy_init();
		if (!easy_handle)
		{
			printf("easy_handle init error\n");
			break;
		}

		// 僅獲取HTTP頭
		ret = curl_easy_setopt(easy_handle, CURLOPT_URL, url.c_str());
		ret |= curl_easy_setopt(easy_handle, CURLOPT_HEADER, 1L);
		ret |= curl_easy_setopt(easy_handle, CURLOPT_NOBODY, 1L);

		if (ret != CURLE_OK)
		{
			break;
		}

		ret = curl_easy_perform(easy_handle);
		if (ret != CURLE_OK)
		{
			break;
		}

		// 沒有查詢到的話size=-1
		ret = curl_easy_getinfo(easy_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size);
		if (ret != CURLE_OK)
		{
			break;
		}
	} while (0);
	
	curl_easy_cleanup(easy_handle);
	return size;
}

相關推薦

libcurl實現斷點

實現斷點續傳主要就是通過curl_easy_setopt設定好CURLOPT_RESUME_FROM_LARGE屬性完成 首先獲取已下載檔案大小,然後設定CURLOPT_RESUME_FROM_LARGE屬性,從指定位元組開始下載 #include <sys/sta

用AsyncTask實現斷點

asynctask實現文件下載與斷點續傳 在學習四大組件之一的service時,正好可以利用asyncTask 和OKhttp來進行斷點續傳,並在手機的前臺顯示下載進度。 嘗試下載的是Oracle官網上的jdk1.7 在AS中使用OKhttp,只需要簡單的在app/build.grad

rsync 實現斷點

direct pan 悲劇 文件 byte font scp命令 size receive Linux 主機之間即時傳送文件,scp命令大家都很熟悉但當要傳送的文件較大,過程中如果網絡中斷了,就比較悲劇了。這時候可以考慮使用rsync命令替代scp,實現斷點續傳文件。 試驗

用Java實現斷點 (HTTP)

斷點續傳的原理 其實斷點續傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。 打個比方,瀏覽器請求伺服器上的一個文時,所發出的請求如下: 假設伺服器域名為 www.sjtu.edu.cn,檔名為 down.zip。 GET /down.zip HTTP/1

5.2 SpringBoot實現斷點功能 > 我的程式猿之路:第四十二章

  功能使用webuploader元件分片下載檔案 文件地址: http://fex.baidu.com/webuploader/document.html 從  http://fex.baidu.com/webuploader/download.html中下載 用到的是:

iOS實現斷點

網路下載是我們在專案中經常要用到的功能,如果是小檔案的下載,比如圖片和文字之類的,我們可以直接請求源地址,然後一次下載完畢。但是如果是下載較大的音訊和視訊檔案,不可能一次下載完畢,使用者可能下載一段時間,關閉程式,回家接著下載。這個時候,就需要實現斷點續傳的功能。讓使用者可以隨時暫停下載,下次開始下

java多執行緒實現斷點下載

public class DownloadThread extends Thread {private int id;private int startindex;private int endindex;private String path;static int threadfinishedcount=0

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

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

簡單實現斷點+MVP+Retrofit+RxJava

依賴: compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.s

Java 實現斷點 (HTTP)

公司需要用Java做斷點續傳的實現,沒有接觸過,不過根據自己的理解就是檔案接著上次傳輸的繼續完成傳輸,具體的操作看到IBM這位仁兄的例子。 1、斷點續傳的原理 其實斷點續傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。  打個比方,瀏覽器請求伺服

http range實現斷點斷點載)

使用http range實現斷點續傳(伺服器端): public void downRangeFile( File downloadFile, HttpServletResponse response,

C#檔案下載(實現斷點

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

用 Java 實現斷點 (HTTP)

/* /* * SiteFileFetch.java */ package NetFox; import java.io.*; import java.net.*; public class SiteFileFetch extends Thread { Sit

自定義Source實現斷點

        在Flume進行實時資料的採集過程中,可能會出現宕機的情況,再重新工作時不能斷點續傳,導致資料丟失或資料讀取重複而浪費資源。自定義Source可以解決這個問題。1)寫一個類繼承AbstractSource抽象類並實現Configurable介面和EventDr

iOS-AFNetworking實現斷點功能

上一節說到利用系統原生的方法實現斷點續傳功能,這次我們說下當下最時尚的第三方網路請求庫AFNetworking,利用AFNet實現斷點續傳。其實原理是和NSURLSessionDataTask一樣的。因為我們都知道AFNet在3.0之後是封裝的NSURLSess

FTP下用reget實現斷點 (FTP下get顯示進度)

同事在Linux通過FTP獲取一個1.3G的大檔案,傳了一個上午,結果在1.1G左右的時候,資料鏈路斷開,ftp命令假死狀態,檔案大小不在增加。如果重新匯入,下午肯定完不成了,得考慮斷點續傳,以前都是通過windows下的工具完成的,目前的問題是:在Unix下如何處理呢?方法

python實現斷點下載檔案

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

Android檔案下載(實現斷點

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

結合服務端實現斷點

本人第一次寫部落格,才疏學淺,希望大牛能指出不足,如有錯,請勿噴 什麼是斷點續傳?     斷點續傳是指,支援從檔案上次中斷的地方開始傳送資料,而並非是從檔案開頭傳送。這樣做的優點是,如果在傳輸一個比較大的檔案,發生連線超時錯誤時,只要客戶端記錄下已經接受的檔案的大小,下

FTP客戶端實現斷點

FTP客戶端是自己做的的第一個C專案,大二暑假做的。現在拿出來看看,當時只是初學者,暑假在學校一個人做了1個多星期。當代碼成功執行時,瞬間感到C的強大與程式設計的樂趣。不懂的朋友可以問我。 connect.c #include <stdio.h> #includ