1. 程式人生 > >如何使用libcurl實現HTTP的GET方法獲取檔案長度

如何使用libcurl實現HTTP的GET方法獲取檔案長度

    在專案中,需要做一個下載中介軟體,檢視資料發現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獲取檔案長度,而不下載檔案內容。