2011-10-06 60 views
4

我想在一些C++代碼中創建一個cURL請求,這將使我獲得服務器中文件的長度而不下載文件。爲此,我使用一些cURL選項來告訴我只需要請求響應中的標題,然後檢查響應以獲取文件長度。如何獲得文件的長度,而無需在cURL二進制文件中下載獲取請求

我設置以下請求選項:

curl_easy_setopt(_curl_handle, CURLOPT_HEADER, 1); 
curl_easy_setopt(_curl_handle, CURLOPT_NOBODY, 1); 

然後,處理請求,等待應答,其示出了OK=200,最後查詢文件長度:

curl_easy_getinfo(_curl_handle, CURLINFO_CONTENT_LENGTH_UPLOAD, &dResult); 

但是我得到的文件長度爲-1。根據cURL文件,這意味着尺寸是未知的。 cURL如何從服務器獲取文件長度信息?

+1

這種信息不可用。嘗試在命令行的同一個URL上運行'curl - head',看它是否顯示文件大小。 –

+0

如果我做了一個'curl --head「https:// ...」'它告訴我'curl:(1)協議https在libcurl中不被支持或禁用。如果我使用'「http://」'或不使用'「http://」'嘗試使用'curl:(7)無法連接到主機'。 – rturrado

+1

使用'curl --version'來查看curl.exe編譯的功能。如果在支持列表中未提及「HTTPS」和「SSL」,則無法請求「HTTPS」網址。 –

回答

4

CURLINFO_CONTENT_LENGTH_UPLOAD是上傳的字節數。您需要改用CURLINFO_CONTENT_LENGTH_DOWNLOAD

請注意,如果服務器動態生成數據,當您實際下載文件而不是下載其標頭時,長度可能會有所不同。

還要注意的是,如果服務器下載時爲壓縮發送數據時,有可能無法在頭文件(如果Transfer-Encoding頭被用來代替Content-Length頭)提供任何尺寸,所以CURLINFO_CONTENT_LENGTH_DOWNLOAD仍然會返回-1。在這種情況下知道尺寸的唯一方法就是全面下載。

+0

我使用UPLOAD而不是DOWNLOAD,因爲我在幾個網頁中發現這個術語有誤導性,如果你想要下載文件的大小,你應該使用UPLOAD(它可能有意義,因爲你詢問一個已經上傳到服務器的文件)。 – rturrado

+0

無論如何,使用下載我得到了'-1'的相同結果。 – rturrado

+0

順便說一句,調試代碼,我到了libcurl中的一個點,函數'Curl_getinfo(struct SessionHandle * data,CURLINFO info,...)'本身,它檢查'data-> progress.flags',並且因爲它們是空的,它返回'-1'。可能是因爲我缺少用'curl_easy_setopt'設置選項? – rturrado

3

您是否嘗試過使用CURLINFO_CONTENT_LENGTH_DOWNLOAD?

0

需要呼叫perform()

curl_easy_setopt(_curl_handle,CURLOPT_HEADER,1); curl_easy_setopt(_curl_handle,CURLOPT_NOBODY,1);

curl_easy_perform(_curl_handle);

curl_easy_getinfo(_curl_handle,CURLINFO_CONTENT_LENGTH_UPLOAD, & dResult);

相關問題