首页 > 其他分享 >libcurl使用心得-包括下载文件不存在处理相关

libcurl使用心得-包括下载文件不存在处理相关

时间:2022-12-26 10:58:11浏览次数:59  
标签:code return libcurl content easy printf curl 心得 下载

Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持Ipv6。并且易于使用。

http://curl.haxx.se/libcurl/

从http://curl.haxx.se/libcurl/ 下载一个稳定的版本,注意选择OS。
在使用之前请大家多阅读libcurl的文档:因为如果要实际运用到项目中,最好对libcurl有具体的了解,具体在
http://curl.haxx.se/libcurl/c/
curl_easy_setopt() 
curl_easy_perform() 
curl_easy_getinfo() 
这三个函数的使用上,需要多去钻研,多看Samples,你才能灵活使用libcurl。
感谢这篇文章:
http://blog.163.com/xu_chao2000/blog/static/27770610200801303252802/
给了我许多启发,再次感谢!

给出我的一个简单的代码例子:
说明:
1.关键在curl_easy_setopt函数设置option,可以设置ftp,http,get,post等许多选项,请根据具体使用情况设置。

2.对取回来的数据需要进行判断,比如http下载文件,如果文件不存在,需要进行处理。因为writer是可以将buf填充404 not found等网页内容的,不能将这个内容当成文件内容,所以需要判断http web返回来的code,进行判断。

3.我有个问题,就是想得到服务器上filename的具体名称,verbose调试已经返回了,但是我在getinfo的时候,试过好多选项,但未找到这个存放真实服务器文件名的选项,如果有知道的麻烦告诉我,谢谢了!

复制代码
#include "curl/curl.h"
#pragma comment(lib, "libcurl.lib")

long writer(void *data, int size, int nmemb, string &content);
bool  CurlInit(CURL *&curl, const char* url,string &content);
bool  GetURLDataBycurl(const char* URL, string &content);

void main()
{
    char *url ="http://www.baidu.com/img/baidu.gif";
    string content;
    if ( GetURLDataBycurl(url,content))
    {
        printf("%s\n",content);

    }
    getchar();
}

bool CurlInit(CURL *&curl, const char* url,string &content)
{
    CURLcode code;
    string error;
    curl = curl_easy_init();
    if (curl == NULL)
    {
        printf( "Failed to create CURL connection\n");
        return false;
    }
    code = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error);
    if (code != CURLE_OK)
    {
        printf( "Failed to set error buffer [%d]\n", code );
        return false;
    }
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    code = curl_easy_setopt(curl, CURLOPT_URL, url);
    if (code != CURLE_OK)
    {
        printf("Failed to set URL [%s]\n", error);
        return false;
    }
    code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    if (code != CURLE_OK)
    {
        printf( "Failed to set redirect option [%s]\n", error );
        return false;
    }
    code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    if (code != CURLE_OK)
    {
        printf( "Failed to set writer [%s]\n", error);
        return false;
    }
    code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
    if (code != CURLE_OK)
    {
        printf( "Failed to set write data [%s]\n", error );
        return false;
    }
    return true;
}

long writer(void *data, int size, int nmemb, string &content)
{
    long sizes = size * nmemb;
    string temp(data,sizes);
    content += temp; 
    return sizes;
}

bool GetURLDataBycurl(const char* URL,  string &content)
{
    CURL *curl = NULL;
    CURLcode code;
    string error;

    code = curl_global_init(CURL_GLOBAL_DEFAULT);
    if (code != CURLE_OK)
    {
        printf( "Failed to global init default [%d]\n", code );
        return false;
    } 
    
    if ( !CurlInit(curl,URL,content) )
    {
        printf( "Failed to global init default [%d]\n" );
        return PM_FALSE;
    }
    code = curl_easy_perform(curl);
    if (code != CURLE_OK)
    {
        printf( "Failed to get '%s' [%s]\n", URL, error);
        return false;
    }
    long retcode = 0;
    code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode); 
    if ( (code == CURLE_OK) && retcode == 200 )
    {
        double length = 0;
        code = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD , &length); 
        printf("%d",retcode);
        FILE * file = fopen("1.gif","wb");
        fseek(file,0,SEEK_SET);
        fwrite(content.c_str(),1,length,file);
        fclose(file);

        //struct curl_slist *list;
        //code = curl_easy_getinfo(curl,CURLINFO_COOKIELIST,&list);
        //curl_slist_free_all (list);

        return true;
    }
    else
    {
    //    debug1( "%s \n ",getStatusCode(retcode));
        return false;
    }
    curl_easy_cleanup(curl);
    return false;
}

标签:code,return,libcurl,content,easy,printf,curl,心得,下载
From: https://www.cnblogs.com/kn-zheng/p/17005209.html

相关文章

  • 如何学习数据分析,分享我的一些心得
    大家好,我是梦想家Alex~相信大家基本都来自于数据领域的各个方向,对学习数据分析呢都多多少少有自己的一些心得!这几年,“数据分析”是很火啊,在这个数据驱动一切的时代,数据挖......
  • 三星电视无法下载《条款和条件、隐私政策》的问题 (消息代码: 0-1)
    问题背景自打政治上不睦后,韩国产品在我国就遇冷了,前有乐天玛特,后有三星,特别是三星手机,市占率从第一到现在份额小到归入"其它",另外像三星电视、显示器的遭遇也都差不多。如......
  • 下载Excel导出模板时设置下拉框
    一个需要导出的数据@DropDownSetField#source注入字符串,作为下拉框数据 @DropDownSetField#sourceClass 注入一个类,获取数据库等持久化数据,作为下拉框数据 @Datapu......
  • 【AGC】集成付费下载服务sdk登录闪退
    问题背景:cp反馈集成付费下载sdk在正常登录时,出现登录闪退的报错,出现故障的手机型号操作系统版本是Android9,集成的付费下载的版本号是drm_v2.5.2.300。部分报错信息:​解决方......
  • Microsoft 365 新功能快递:更改Teams中文件默认下载地址
    51CTO博客地址:​​​https://blog.51cto.com/u_13637423​​我们都知道MicrosoftTeams中分享文件的默认存储位置,比如在1:1的PrivateChat中,共享的文件默认是存储在分享者......
  • 【AGC】集成付费下载服务sdk登录闪退
    问题背景:cp反馈集成付费下载sdk在正常登录时,出现登录闪退的报错,出现故障的手机型号操作系统版本是Android9,集成的付费下载的版本号是drm_v2.5.2.300。部分报错信息:​ ......
  • 下载谷歌(chrome)浏览器离线包
    https://www.google.cn/chrome/thank-you.html?platform=win64&standalone=1&statcb=0&installdataindex=empty&defaultbrowser=0standalone=1表示离线安装包,win64代表6......
  • 微信公众号下载视频
    如图,将视频下载到本地步骤用电脑浏览器打开网页链接,按【F12】-点击【网络】按F5刷新一下网页,再重新播放视频,按照文件大小从高到低排序双击左边第一个内容,右击url复制值将复......
  • 在Linux下OpenCV的下载和编译
    完整从代码编译OpenCV在很多情况下是必须的。总体上来看,都是下载、编译、配置这三个过程,其中一些细节值得注意,记录如下。这里以ubuntu为例,其他发行版可能略有不同。1......
  • “你帮我助”软件开发(Final)文档以及心得体会
    “你帮我助”软件开发(Final)文档本项目是上海交通大学《软件工程》期末大作业。背景描述这是一个物品交换应用程序,它的目的是帮助居民能够在疫情期间进行物品交换和互......