如何在不下载cURL二进制get请求中的文件的情况下获取文件的长度 我想在一些C++代码中创建一个卷曲请求,它将在服务器上下载文件的长度,而不下载文件。为此,我使用一些cURL选项告诉您我只需要请求-响应中的头,然后检查响应以获得文件长度

如何在不下载cURL二进制get请求中的文件的情况下获取文件的长度 我想在一些C++代码中创建一个卷曲请求,它将在服务器上下载文件的长度,而不下载文件。为此,我使用一些cURL选项告诉您我只需要请求-响应中的头,然后检查响应以获得文件长度,c++,curl,C++,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_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怎么可能没有从服务器获取文件长度信息呢?

您是否尝试过使用CURLINFO\u CONTENT\u length\u DOWNLOAD来代替?

CURLINFO\u CONTENT\u length\u UPLOAD
是上载的字节数。您需要使用
CURLINFO\u CONTENT\u LENGTH\u DOWNLOAD

请注意,如果服务器动态生成数据,则实际下载文件时的长度可能与仅下载文件头时的长度不同

还请注意,如果服务器在下载时发送压缩数据,则标头中可能没有任何可用大小(如果使用
传输编码
标头而不是
内容长度
标头),因此
卷发信息内容长度\u下载
仍将返回
-1
。在这种情况下,了解大小的唯一方法是完整下载。

需要调用
perform()

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

curl\u易于执行(\u curl\u handle)

curl\u easy\u getinfo(\u curl\u handle,CURLINFO\u CONTENT\u LENGTH\u UPLOAD, &dResult)


没有这些信息并不罕见。试着从命令行在同一个URL上运行
curl--head
,看看它是否显示文件大小https://...“
它告诉我
curl:(1)libcurl中不支持或禁用协议https
。如果我尝试使用
“http://”
或不使用
“http://”
则会显示
curl:(7)无法连接到主机
。请使用
curl--version
查看curl.exe的编译功能。如果支持的列表中未提及
HTTPS
SSL
,则您无法请求
HTTPS
URL。我使用的是上载而不是下载,因为我在多个网页中发现该术语具有误导性,如果您想要下载的文件的大小,则应使用上载(这可能是有意义的,因为您询问的是一个已经上传到服务器的文件)。无论如何,使用下载我得到了与
-1
相同的结果。顺便说一句,调试代码,我在libcurl中得到了一个点,函数
Curl\u getinfo(struct SessionHandle*data,CURLINFO,…)
本身,它检查
数据->进度。标记
,由于它们为空,它返回
-1
。可能是我没有设置
curl\u easy\u setopt
?服务器是否发送成功或失败响应代码?我建议使用数据包嗅探器,如Wireshark,以确保libcurl是se正在发送一个有效的请求并查看它接收到的响应类型。我无法使用wireshark,因为我正在发送https请求。但是,我的工具获取服务器输出。我看到的是:
HTTP/1.1200 OK Content length:213 Content Type:text/xml;charset=ISO-8859-1 Date:Mon,2011年10月10日10:52:31 GMT Variable:Accept Encoding X-Powered-By:Servlet2.5;JBoss-5.0/JBossWeb-2.1连接:保持活动状态
对于任何二进制请求,我总是获得213的内容长度。如果您需要同时获取标题和正文,那么在curl_easy_执行过程中会遇到一些挑战,因为您需要获取/缓冲正文(适当地设置CURLOPT_),然后确定大小,然后做适当的事情…看起来这是不推荐的,现在喜欢卷发信息、内容、长度、下载。