关闭

如何使用libcurl实现HTTP的GET方法获取文件长度

14077人阅读 评论(1) 收藏 举报

 在项目中,需要做一个下载中间件,查看资料发现libcurl很适合,因此选用libcurl来实现HTTP下载功能。


     用libcurl实现下载功能很方便,只要调用libcurl库的

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. curl_easy_init()  
  2. curl_easy_setopt()  
  3. curl_easy_perform()  
  4. curl_easy_getinfo()  

就可以完成http下载,并且libcurl教程很多,网上资料也很多。


    对于libcurl获取文件长度,网上比较多的做法如下:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. long downloadFileLenth = 0;  
  2. CURL *handle = curl_easy_init();  
  3. curl_easy_setopt(handle, CURLOPT_URL, url);  
  4. curl_easy_setopt(handle, CURLOPT_HEADER, 1);    //只要求header头  
  5. curl_easy_setopt(handle, CURLOPT_NOBODY, 1);    //不需求body  
  6. if (curl_easy_perform(handle) == CURLE_OK)  
  7. {  
  8.    curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);  
  9. }  
  10. else {  
  11.    downloadFileLenth = -1;  
  12. }  
  13. curl_easy_cleanup(handle);  

    但是这种做法,默认是通过HTTP的HEAD方式来获取的,但是并不是所有HTTP的服务器都是支持HEAD方式来获取,比如说本人项目中,

有个HTTP server就不支持HEAD方式,而只能使用GET方式来获取文件长度,所以这种方式不可行, 本希望能够使用如下代码段来实现:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. long downloadFileLenth = 0;  
  2. CURL *handle = curl_easy_init();  
  3. curl_easy_setopt(handle, CURLOPT_URL, url);  
  4. curl_easy_setopt(handle, CURLOPT_HTTPGET, 1);    //使用HTTPGET  
  5. curl_easy_setopt(handle, CURLOPT_NOBODY, 1);    //不需求body  
  6. if (curl_easy_perform(handle) == CURLE_OK)  
  7. {  
  8.    curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);  
  9. }  
  10. else {  
  11.    downloadFileLenth = -1;  
  12. }  
  13. curl_easy_cleanup(handle);   

    但是发现还是用的HEAD方式获取,查看libcurl源代码发现,当设置CURLOPT_NOBODY,libcurl会默认设置获取方式为HEAD方式,如果把

set nobody的option去掉,又会下载文件内容!所以上面代码无法满足。

    没办法只能看libcurl源代码,终于发现如下解决方案:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. long downloadFileLenth = 0;  
  2. CURL *handle = curl_easy_init();  
  3. curl_easy_setopt(handle, CURLOPT_URL, url);  
  4. curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, “GET”);    //使用CURLOPT_CUSTOMREQUEST  
  5. curl_easy_setopt(handle, CURLOPT_NOBODY, 1);    //不需求body  
  6. if (curl_easy_perform(handle) == CURLE_OK)  
  7. {  
  8.    curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &downloadFileLenth);  
  9. }  
  10. else {  
  11.    downloadFileLenth = -1;  
  12. }  
  13. curl_easy_cleanup(handle);   

可以完美解决用GET获取文件长度,而不下载文件内容。
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

libcurl学习笔记(一)

libcurl是C语言开发的网络库,支持多种网络协议. 开发前的准备 开发环境windows, vs2005. 先下载Curl,目前最新版本:7.22.0 libcurl有现成的vs工程,在curl-7.22.0\lib目录,将其编译成静态库,生成libcurl.lib. 建一练习工程,从...
  • hzyong_c
  • hzyong_c
  • 2012-07-22 23:23
  • 10743

libcurl增加HTTP header 和 POST之后获取返回数据

libcurl增加HTTP header 和 POST之后获取返回数据 flyfishstatic size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) { size_t written = fwrite...
  • flyfish1986
  • flyfish1986
  • 2016-03-15 14:34
  • 6344

LibCurl HTTP部分详细介绍

目录索引: 一、LibCurl基本编程框架 二、一些基本的函数 三、curl_easy_setopt函数部分选项介绍 四、curl_easy_perform 函数说明(error 状态码) 五、libcurl使用的HTTP消息头六、获取http应答头信息 七、多线程问题 八、什么时候l...
  • fengshuiyue
  • fengshuiyue
  • 2014-09-24 22:09
  • 57584

libcurl 获取服务器文件大小

static size_t save_header(void *ptr, size_t size, size_t nmemb, void *data) {         return (size_t)(size *...
  • awsqsh
  • awsqsh
  • 2013-07-19 22:52
  • 5201

如何使用libcurl实现HTTP的GET方法获取文件长度

在项目中,需要做一个下载中间件,查看资料
  • xxpyb
  • xxpyb
  • 2014-10-09 20:08
  • 2347

(二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能

本节jwisp为大家举例说明如果使用上节介绍的函数和参数,在使用libcurl的过程中,如何获取下载目标文件的大小 , 下载进度条,断点续传等,这些基本的函数,将为jwisp在最后处理下载过程异常中断等问题提供支持. 1.      编写得到下...
  • javarat
  • javarat
  • 2012-09-20 22:53
  • 9846

c++中使用libcurl库进行http网络编程

目录索引: 一、LibCurl基本编程框架 二、一些基本的函数 三、curl_easy_setopt函数部分选项介绍 四、curl_easy_perform 函数说明(error 状态码) 五、libcurl使用的HTTP消息头 六、获取http应答头信息 七、多线程问题 八、什么时候...
  • wangqing_12345
  • wangqing_12345
  • 2016-08-15 15:04
  • 1643

libcurl 使用说明和网页抓取 linux下的curl编程

1         LibCurl简介 LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,L...
  • lvchaocccc
  • lvchaocccc
  • 2015-11-18 11:22
  • 1503

c语言libcurl 使用实例get/post方法+c语言字符串处理

#include #include #include #include #include #define TMP_FILE "tmp.html" #define HTML_BUFFER_SIZE 1024*800 void split(char **arr, char...
  • earbao
  • earbao
  • 2014-02-21 12:40
  • 17597

libcurl库的http get和http post使用

一、libcurl中的http get使用方法 1. 为什么要使用libcurl 1) 作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要分析协议头,实现代理…这样太麻烦了。   2) libcurl是一个...
  • yzn3831
  • yzn3831
  • 2014-01-26 15:39
  • 4313
    个人资料
    • 访问:220392次
    • 积分:3751
    • 等级:
    • 排名:第9989名
    • 原创:148篇
    • 转载:135篇
    • 译文:3篇
    • 评论:10条