如何使用libcurl實現HTTP的GET方法獲取檔案長度
阿新 • • 發佈:2019-02-02
在專案中,需要做一個下載中介軟體,檢視資料發現libcurl很適合,因此選用libcurl來實現HTTP下載功能。
用libcurl實現下載功能很方便,只要呼叫libcurl庫的
curl_easy_init()
curl_easy_setopt()
curl_easy_perform()
curl_easy_getinfo()
就可以完成http下載,並且libcurl教程很多,網上資料也很多。
對於libcurl獲取檔案長度,網上比較多的做法如下:
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; } curl_easy_cleanup(handle);
但是這種做法,預設是通過HTTP的HEAD方式來獲取的,但是並不是所有HTTP的伺服器都是支援HEAD方式來獲取,比如說本人專案中,
有個HTTP server就不支援HEAD方式,而只能使用GET方式來獲取檔案長度,所以這種方式不可行, 本希望能夠使用如下程式碼段來實現:
long downloadFileLenth = 0; CURL *handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_URL, url); curl_easy_setopt(handle, CURLOPT_HTTPGET, 1); //使用HTTPGET 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; } curl_easy_cleanup(handle);
但是發現還是用的HEAD方式獲取,檢視libcurl原始碼發現,當設定CURLOPT_NOBODY,libcurl會預設設定獲取方式為HEAD方式,如果把
set nobody的option去掉,又會下載檔案內容!所以上面程式碼無法滿足。
沒辦法只能看libcurl原始碼,終於發現如下解決方案:
long downloadFileLenth = 0; CURL *handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_URL, url); curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, “GET”); //使用CURLOPT_CUSTOMREQUEST 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; } curl_easy_cleanup(handle);
可以完美解決用GET獲取檔案長度,而不下載檔案內容。