如何使用libcurl实现HTTP的GET方法获取文件长度
来源:互联网 发布:算法统宗校释 编辑:程序博客网 时间:2024/04/30 01:53
在项目中,需要做一个下载中间件,查看资料发现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获取文件长度,而不下载文件内容。
0 0
- 如何使用libcurl实现HTTP的GET方法获取文件长度
- 如何使用libcurl实现HTTP的GET方法获取文件长度
- 如何使用libcurl实现HTTP的GET方法获取文件长度
- libcurl使用HTTP的get请求来下载文件
- 使用Http Head方法获取文件长度
- libcurl库的http get和http post使用
- libcurl库的http get和http post使用
- 使用libcurl实现简单的HTTP访问
- 实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现
- 实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现
- libcurl get post http
- libcurl http get
- 关于Http Get方法提交URL最大长度的限制
- 使用libcurl获取经过gzip压缩的网页文件
- 使用libcurl获取经过gzip压缩的网页文件
- c语言获取文件长度的方法
- C中获取文件长度的方法
- 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)
- BitmapFactory.decodeStream。报错:SkImageDecoder::Factory returned null 原因及解决方法
- poj1942求组合数
- iOS 自定义分区头加上图片 以及导航控制器 颜色随滑动改变
- HDU - 4006 The kth great number (set&数据结构)
- SpringMVC 获得应用的绝对路径
- 如何使用libcurl实现HTTP的GET方法获取文件长度
- json解析
- Android自定义控件+popuwindow下拉菜单的实现仿58下拉菜单
- ANR traces分析 系统一直出现 waiting for ...日志
- CentOs7 开启网络连接
- 正确使用iOS常量(const)、enum以及宏(#define)
- Linux workqueue工作原理
- 二进制求和
- MySQL簇--mysql集群搭建