2011-10-06 121 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);

相关问题